Мне нужно сохранить только одну строку, в которой дублируется значение, т. Е. Удалить каждую строку, которая не является «первой», с дублированным значением.
У меня есть следующая таблица с именем ART_NEW:
PHARMACODE | GTIN | {Other stuff}
111 1234 ...
- ФАРМАКОД - это первичный ключ (целое число)
- GTIN - это другое целое число, предположительно уникальное, но иногда случаются столкновения.
Источник данных для этой таблицы готовится к переходу от PHARMACODE к GTIN в качестве первичного ключа, но этот переход еще не завершен. Я не контролирую источник каким-либо образом.
Чтобы использовать GTIN
в качестве PK в некоторых приложениях, мне нужно удалить все, кроме одной строки, где дублируется GTIN (все строки с одинаковым GTIN описывают один и тот же продукт, с небольшими изменениями в его описании, поэтому не имеет значения, какая строка удалена, а какая нет, если я получу только одну строку для конкретного значения GTIN).
Следующий запрос делает именно то, что мне нужно, но ужасно медленно (> 1 минута выполнения на 350 000 записей с 120 строками с дублирующимися значениями GTIN):
DELETE *
FROM ART_NEW
WHERE ART_NEW.PHARMACODE IN
(SELECT PHARMACODE FROM
(SELECT
ART_NEW.[PHARMACODE],
ART_NEW.GTIN,
(SELECT Count(*)
FROM ART_NEW As X
WHERE X.GTIN = ART_NEW.GTIN
AND X.PHARMACODE <= ART_NEW.PHARMACODE) AS SeqNo
FROM ART_NEW
WHERE ART_NEW.[GTIN] In
(SELECT [GTIN] FROM [ART_NEW] As Tmp GROUP BY [GTIN] HAVING Count(*)>1))
WHERE SeqNo > 1);
Как я могу оптимизировать этот код? В качестве альтернативы, есть ли лучший способ достичь моей цели удаления каждой строки, кроме одной с дублирующимися значениями GTIN?