как удалить из таблицы дублирующиеся строки?

PrettyFly_M
Дата: 15.05.2004 12:00:00
есть таблица, в которой записи должны быть уникальны по сочетанию двух полей - имя+фамилия
так исторически сложилось, что у нее нет ограничений типа unique или primary key
надо каким-то образом ее очистить от дублирующихся по сочетанию имя+фамилия значений
подскажите, пожалуйста, как это сделать
ЗЫ: таблица огромная(десятки миллионов)
Genady
Дата: 15.05.2004 12:39:49
2 PrettyFly_M

OID поле есть?
Попробуте так :
delete from table t1
where t1.OID not in (select t2.OID from table t2 where t2.name = t1.name and t2.lastname = t1.lastname)

P.S. В MS SQL это можно сделать через джоин, если мне кто либо покажет что так же можно сделать в Postgre буду благодарен. :)
Genady
Дата: 15.05.2004 12:41:26
Сорри неправильно подсказал
Genady
Дата: 15.05.2004 12:43:06
Правильно так:
delete from table t1
where t1.OID not in (select t2.OID from table t2 where t2.name = t1.name and t2.lastname = t1.lastname and t2.OID > t1.OID)
Genady
Дата: 15.05.2004 12:44:53
Опять неправильно
delete from table t1
where t1.OID in (select t2.OID from table t2 where t2.name = t1.name and t2.lastname = t1.lastname and t2.OID > t1.OID)

Прошу прощения, это из за расстройства от отсутствия джоинов
Shweik
Дата: 18.05.2004 14:37:28
"Разве наши слоны уже летают??? Значит летают! "
Это я про "отсутствие джоинов" 8)
Можно так. План наверняка будет красивее чем у варианта с подзапросом.
SELECT t1.name FROM
allobj t2 FULL JOIN allobj t1 ON t1.name =
t2.name where a2.oid>a1.oid;
Genady
Дата: 18.05.2004 15:02:28
2 Shweik

Это я про "отсутствие джоинов"

А показать? Между прочим я говорил не о селекте. :)
А Ваш запрос я бы все таки попроще переписал, например так:
SELECT t1.name FROM 
allobj t2 inner JOIN allobj t1 ON 
t1.name = t2.name and a2.oid>a1.oid;

Правда я не понимаю как этот селект может помочь удалить дубликаты :)
Shweik
Дата: 18.05.2004 15:52:26
Угу -короче незнал да еще и забыл что delete не понимает joinoв.
Сорри.
И судя по обсуждению этот TODO будет выполнен в PG 8.0 8-\
http://momjian.postgresql.org/cgi-bin/pgtodo?delete
Соответственно ничего получается только так:
delete from allobj where oid in (
SELECT t1.oid FROM allobj t2
inner JOIN allobj t1 ON t1.name = t2.name and a2.oid>a1.oid);
Впрочем планировщик и без явного join-a делает практически тоже самое 8)
Genady
Дата: 18.05.2004 16:38:42
Впрочем планировщик и без явного join-a делает практически тоже самое 8)
Как нибудь выкрою время, посмотрю что там делает планировщик. :)
впрочем это уже оффтоп :)
Genady
Дата: 18.05.2004 16:40:34
2 Shweik

Кстати, в Вашем последнем примере лишний джоин ни к чему :) Подзапрос то уже есть.