Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

Вопрос по SQL   Найти похожие ветки 

 
Pk   (2003-02-06 13:27) [0]

Есть таблица, состоящая из 4 полей. Первые 2 поля должны быть уникальны но в базе не было введено ограничение на уникальность в результате появились записи в которых комбинация из этих 2 полей повторяется. Так вот, как выбрать нужные записи или удалить лишние?


 
sniknik ©   (2003-02-06 13:42) [1]

SELECT DISTINCT .... выбрать, и удалить также можно SELECT * INTO FROM SELECT DISTINCT ...., исходную удалить а получившуюся переименовать.

а вообще смотря как решать какие "нужные" а какие "лишние". DISTINCT кстати полное совпадения строк убирает, если дублирование по 1 полю смотреть то примерно
SELECT * FROM Table1 WHERE id IN (SELECT DISTINCT id FROM Table1)
и т.д.


 
Pk   (2003-02-06 13:46) [2]


> если дублирование по 1 полю смотреть то примерно
> SELECT * FROM Table1 WHERE id IN (SELECT DISTINCT id FROM
> Table1)


а мне нужно исключить дублирование по 2 полям. Что то типа SELECT * FROM Table1 WHERE (id1,id2) IN (SELECT DISTINCT id1,id2 FROM Table1).


 
DarkGreen ©   (2003-02-06 13:50) [3]

Так что ли?
select Field1, Field2, Count(Field1) Count(Field2)
where (Count(Field1) > 1) and (Count(Field2) > 1)
group by Field1, Field2


 
stone ©   (2003-02-06 13:53) [4]


> SELECT * FROM Table1 WHERE (id1,id2) IN (SELECT DISTINCT
> id1,id2 FROM Table1).

так все равно всех выберет

тут важно знать возможны ли поторения значений во всех черырех полях одновременно? Если нет. Будем анализировать дальше.


 
sniknik ©   (2003-02-06 13:56) [5]

я бы сделал просто, так
SELECT * FROM Table1 WHERE id1*1000+id2 IN (SELECT DISTINCT id1*1000+id2 FROM Table1)

естественно 1000 может мало, а посмотреть на твою таблицу не могу, выдымывай сам.


 
Pk   (2003-02-06 14:14) [6]


> SELECT * FROM Table1 WHERE id1*1000+id2 IN (SELECT DISTINCT
> id1*1000+id2 FROM Table1)

- возвращает всю таблицу

> так все равно всех выберет

и вправду всех выбирает (что показал приведенный пример). В некоторых записях есть действительно повторение по всем полям но в некоторых повторяются только 2 ключевых.


 
stone ©   (2003-02-06 14:21) [7]


> и вправду всех выбирает (что показал приведенный пример).
> В некоторых записях есть действительно повторение по всем
> полям но в некоторых повторяются только 2 ключевых.


Тогда единственный способ проехать курсором, вопрос только в том какие записи из дубликатов оставить, а какие удалить. При полном соответствии - все ясно, а при частичном - решать вам.


 
DarkGreen ©   (2003-02-06 14:28) [8]

То что я предложил ты похоже не смотрел?


 
Reindeer Moss Eater   (2003-02-06 14:30) [9]

Delete From table Where Первичный_Ключ not in (select MAX(Первичный_Ключ) from Table Group By Поле1, Поле2 )


 
sniknik ©   (2003-02-06 14:34) [10]

нет не единственный, просто в самом запросе глючок.

SELECT DISTINCT id FROM Table1
дает действительно уникальную (обрезанную) линейку значений.
а вот условие
WHERE id IN, выбирает все записи которые есть в выбранной линейке, в том числе и повтор.

надо модифицировать, ввести (временно) 1 действительно уникальное поле и в условие уже ставить его.


 
Pk   (2003-02-06 14:38) [11]


DarkGreen © (06.02.03 13:50)

select Field1, Field2, Count(Field1), Count(Field2) from T1
where (Count(Field1) > 1) and (Count(Field2) > 1)
group by Field1, Field2

Ошибка: "Недопустимая смесь функций и колонок" (Oracle)



 
Danilka ©   (2003-02-06 14:44) [12]

вот здесь:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1043925029&n=1

есть красивое решение.


 
stone ©   (2003-02-06 14:52) [13]


> надо модифицировать, ввести (временно) 1 действительно уникальное
> поле и в условие уже ставить его

Совершенно верно. Добавить автоинкрементное поле.

alter table TableName add tmp_id integer IDENTITY(1,1)

delete from TableName from TableName h where exists (select ctlg_no from TableName where key1 = h.key1 and key2 = h.key2 and tmp_id > h.tmp_id)


 
stone ©   (2003-02-06 14:53) [14]


> delete from TableName from TableName h where exists (select
> ctlg_no from TableName where key1 = h.key1 and key2 = h.key2
> and tmp_id > h.tmp_id)

копировал из своего действующего запроса не все переделал..

alter table TableName add tmp_id integer IDENTITY(1,1)

delete from TableName from TableName h where exists (select * from TableName where key1 = h.key1 and key2 = h.key2 and tmp_id > h.tmp_id)


 
sniknik ©   (2003-02-06 14:54) [15]

если > (Oracle) и там есть rowid то и вводить уника не не понадобится, есть.

предупреждать надо какая база.


 
Danilka ©   (2003-02-06 15:14) [16]

sniknik © (06.02.03 14:54)
в орокле еще и очень быстрый minus есть :))


 
Pk   (2003-02-06 15:34) [17]

minus проблему не решал. select Field1, Field2 from T1 minus select distinct Field1, Field2 from T1 не возвращал ни 1 строчки.



 
Danilka ©   (2003-02-06 15:37) [18]

Pk (06.02.03 15:34)
я давал ссылку.
там есть решение для орокла, с минусом, оно шерстило таблицу в полтора миллиона записей за 35 сек.

я для себя раньше решал это проблему по-тупому, без ровид.
мое решение тоже есть в этой ссылке.
оно, подойдет для любой бд, даже для той, у которой нет уникального ровид.



Страницы: 1 вся ветка

Текущий архив: 2003.02.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-75930
OGR
2003-02-14 17:25
2003.02.24
Парсинг HTML файла


14-76168
Amit
2003-02-07 12:21
2003.02.24
Продолжение Kuliba, быть ему или нет?


1-75917
Vitus
2003-02-14 12:39
2003.02.24
Логины пользователей домена


3-75797
alexander_ua
2003-02-06 14:21
2003.02.24
Подскажите, где найти доки по построению бд клиент-сервер


1-75946
happyboy
2003-02-11 18:31
2003.02.24
PopupMenu и спец. фонты