Использование TSQL, понятия не имею, если Postgres не поддерживает временные таблицы, но вы можете выбрать в временную таблицу, а затем перебрать и удалить и вставить результаты обратно в исходное
-- **Disclaimer** using TSQL
-- You could select your records into a temp table with a pk
Create Table #dupes
([id] int not null identity(1,1), f1 int, f2 int, f3 int)
Insert Into #dupes (f1,f2,f3) values (1,2,3)
Insert Into #dupes (f1,f2,f3) values (1,2,3)
Insert Into #dupes (f1,f2,f3) values (1,2,3)
Insert Into #dupes (f1,f2,f3) values (2,3,4)
Insert Into #dupes (f1,f2,f3) values (4,5,6)
Insert Into #dupes (f1,f2,f3) values (4,5,6)
Insert Into #dupes (f1,f2,f3) values (4,5,6)
Insert Into #dupes (f1,f2,f3) values (7,8,9)
Select f1,f2,f3 From #dupes
Declare @rowCount int
Declare @counter int
Set @counter = 1
Set @rowCount = (Select Count([id]) from #dupes)
while (@counter < @rowCount + 1)
Begin
Delete From #dupes
Where [Id] <>
(Select [id] From #dupes where [id][email protected])
and
(
[f1] = (Select [f1] from #dupes where [id][email protected])
and
[f2] = (Select [f2] from #dupes where [id][email protected])
and
[f3] = (Select [f3] from #dupes where [id][email protected])
)
Set @counter = @counter + 1
End
Select f1,f2,f3 From #dupes -- You could take these results and pump them back into --your original table
Drop Table #dupes
Испытано это на МС SQL Server 2000. Не знакомы с параметрами Postgres, но, возможно, это приведет вас в правильном направлении.
Я не уверен, правильно ли я это понимаю. Вы говорите: «PK - это 3 поля» - тогда как получилось, что у вас есть дубликаты в таблице, как несколько записей 1-2-3. Поправьте меня, если я ошибаюсь. – 2008-10-28 15:02:00
PK был в трех полях, нам пришлось удалить их для слияния (длинный рассказ), теперь нам нужно вернуть его обратно. У нас есть несколько дубликатов, которые мы хотели бы снять. – 2008-10-28 15:10:31