Как удалить дубликаты записей в таблице? - PullRequest
2 голосов
/ 03 мая 2010

У меня есть таблица в тестируемой БД, которая, по-видимому, слишком радует триггера при запуске сценариев INSERT для ее настройки. Схема выглядит следующим образом:

ID UNIQUEIDENTIFIER
TYPE_INT SMALLINT
SYSTEM_VALUE SMALLINT
NAME VARCHAR
MAPPED_VALUE VARCHAR

У него должно быть несколько десятков рядов. Он содержит около 200 000, большинство из которых являются дубликатами, в которых TYPE_INT, SYSTEM_VALUE, NAME и MAPPED_VALUE все идентичны, а ID не является.

Теперь я, вероятно, мог бы создать скрипт для очистки этого, который создает временную таблицу в памяти, использует INSERT .. SELECT DISTINCT, чтобы получить все уникальные значения, TRUNCATE исходную таблицу и затем скопировать все обратно. Но есть ли более простой способ сделать это, например запрос DELETE с чем-то особенным в предложении WHERE?

Ответы [ 3 ]

4 голосов
/ 03 мая 2010

Вы не называете свою таблицу, но я думаю, что-то вроде этого должно работать.Просто оставив запись, у которой самый низкий идентификатор.Возможно, вы захотите сначала проверить ROLLBACK!

BEGIN TRAN
DELETE <table_name>
FROM <table_name> T1
WHERE EXISTS(
SELECT * FROM <table_name> T2 
WHERE     
T1.TYPE_INT = T2.TYPE_INT  AND
T1.SYSTEM_VALUE = T2.SYSTEM_VALUE  AND
T1.NAME = T2.NAME  AND
T1.MAPPED_VALUE = T2.MAPPED_VALUE  AND
T2.ID > T1.ID
)

SELECT * FROM <table_name>

ROLLBACK
3 голосов
/ 03 мая 2010

Вот отличная статья об этом: Удаление дубликатов , которая в основном использует этот шаблон:

WITH    q AS
        (
        SELECT  d.*,
                ROW_NUMBER() OVER (PARTITION BY id ORDER BY value) AS rn
        FROM    t_duplicate d
        )
DELETE
FROM    q
WHERE   rn > 1

SELECT  *
FROM    t_duplicate
2 голосов
/ 03 мая 2010
WITH Duplicates(ID , TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE )
AS
(
SELECT  Min(Id)  ID  TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE 
FROM T1
GROUP BY TYPE_INT, SYSTEM_VALUE, NAME, MAPPED_VALUE
HAVING Count(Id) > 1
)
DELETE FROM T1
WHERE ID IN (
SELECT T1.Id
FROM T1
INNER JOIN Duplicates
ON T1.TYPE_INT = Duplicates.TYPE_INT
AND T1.SYSTEM_VALUE = Duplicates.SYSTEM_VALUE
AND T1.NAME = Duplicates.NAME
AND T1.MAPPED_VALUE = Duplicates.MAPPED_VALUE
AND T1.Id <> Duplicates.ID
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...