Удалите дубликат из таблицы

Вы можете использовать уникальное задание, это одна из многих функций, которыми обладает Sidekiq Enterprise.

https://github.com/mperham/sidekiq/wiki/Ent-Unique-Jobs

5
задан Patrick Desjardins 28 October 2008 в 14:38
поделиться

7 ответов

Это - одна из многих причин, что все таблицы должны иметь первичный ключ (не обязательно Идентификационный номер или ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, но комбинация одного или нескольких столбцов, которая однозначно определяет строку и которой осуществили ее уникальность в базе данных).

Ваш лучший выбор - что-то вроде этого:

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
6
ответ дан 14 December 2019 в 13:51
поделиться

Хорошо я должен неправильно понять что-то, но я скажу:

ВЫБЕРИТЕ ОТЛИЧНЫЙ field1, field2, field3 ОТ table1

Слишком легкий, чтобы быть хорошим? ^^

0
ответ дан 14 December 2019 в 13:51
поделиться

Это - самый простой метод, который я нашел:

Синтаксис 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
0
ответ дан 14 December 2019 в 13:51
поделиться

Используя 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. Не знакомый с опциями Пост-ГРЭС, но возможно это приведет Вас в правильном направлении.

0
ответ дан 14 December 2019 в 13:51
поделиться

Это будет использовать Идентификатор объекта OID (если таблица была составлена с ним):

DELETE FROM table1
WHERE OID NOT IN (SELECT   MIN (OID)
                              FROM table1
                          GROUP BY field1, field2, field3)
0
ответ дан 14 December 2019 в 13:51
поделиться

Хороший Ответ для этой проблемы, но для SQL Server. Это использует ROWCOUNT, который SQL Server предлагает, успешно. Я никогда не использовал PostgreSQL и следовательно не знаю эквивалент ROWCOUNT в PostgreSQL.

0
ответ дан 14 December 2019 в 13:51
поделиться

Один возможный ответ:

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.

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

0
ответ дан 14 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: