Вы можете использовать уникальное задание, это одна из многих функций, которыми обладает Sidekiq Enterprise.
Это - одна из многих причин, что все таблицы должны иметь первичный ключ (не обязательно Идентификационный номер или ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, но комбинация одного или нескольких столбцов, которая однозначно определяет строку и которой осуществили ее уникальность в базе данных).
Ваш лучший выбор - что-то вроде этого:
SELECT field1, field2, field3, count(*)
INTO temp_table1
FROM table1
GROUP BY field1, field2, field3 having count(*) > 1
DELETE T1
FROM table1 T1
INNER JOIN (SELECT field1, field2, field3
FROM table1
GROUP BY field1, field2, field3 having count(*) > 1) SQ ON
SQ.field1 = T1.field1 AND
SQ.field2 = T1.field2 AND
SQ.field3 = T1.field3
INSERT INTO table1 (field1, field2, field3)
SELECT field1, field2, field3
FROM temp_table1
DROP TABLE temp_table1
Хорошо я должен неправильно понять что-то, но я скажу:
ВЫБЕРИТЕ ОТЛИЧНЫЙ field1, field2, field3 ОТ table1
Слишком легкий, чтобы быть хорошим? ^^
Это - самый простой метод, который я нашел:
Синтаксис SQL Postgre:
CREATE TABLE tmp AS SELECT distinct * FROM table1
truncate table table1
insert into table1 select * from tmp
drop table tmp
Синтаксис T-SQL:
select distinct * into #tmp from table1
truncate table table1
insert into table1 select * from #tmp
drop table #tmp
Используя TSQL, никакая идея, если Пост-ГРЭС поддерживает временные таблицы, но Вы могли бы выбрать во временную таблицу и затем цикл через и удалить и вставить свои результаты назад в оригинал
-- **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]=@counter)
and
(
[f1] = (Select [f1] from #dupes where [id]=@counter)
and
[f2] = (Select [f2] from #dupes where [id]=@counter)
and
[f3] = (Select [f3] from #dupes where [id]=@counter)
)
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 MS. Не знакомый с опциями Пост-ГРЭС, но возможно это приведет Вас в правильном направлении.
Это будет использовать Идентификатор объекта OID (если таблица была составлена с ним):
DELETE FROM table1
WHERE OID NOT IN (SELECT MIN (OID)
FROM table1
GROUP BY field1, field2, field3)
Хороший Ответ для этой проблемы, но для SQL Server. Это использует ROWCOUNT, который SQL Server предлагает, успешно. Я никогда не использовал PostgreSQL и следовательно не знаю эквивалент ROWCOUNT в PostgreSQL.
Один возможный ответ:
CREATE <temporary table> (<correct structure for table being cleaned>);
BEGIN WORK; -- if needed
INSERT INTO <temporary table> SELECT DISTINCT * FROM <source table>;
DELETE FROM <source table>
INSERT INTO <source table> SELECT * FROM <temporary table>;
COMMIT WORK; -- needed
DROP <temporary table>;
Я не уверен, необходима ли 'работа' на операторах транзакции, ни начинаются ли явные, необходимо в PostgreSQL. Но понятие относится к любому DBMS.
Единственной вещью остерегаться являются ограничения по внешнему ключу, и в особенности инициированный удаляют операции. Если они существуют, это может оказаться менее удовлетворительным.