Текущий архив: 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