Microsoft T-SQL - есть ли способ удалить записи, которые имеют дубликаты? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь добавить составной первичный ключ к таблице, которую я назвал «Запас». Поскольку в первичном ключе есть дубликаты, которые мне нужны, он не позволит мне добавить первичный ключ, поэтому есть ли способ удалить 1 каждый дубликат в одном запросе вместо необходимости делать это вручную?

Я нашел все дубликаты, используя этот запрос (всего 67 строк с дубликатами):

SELECT Count(*), STK, yr, mn, dy
FROM Stock
GROUP BY STK, yr, mn, dy
HAVING count(*) > 1
ORDER BY STK ASC;

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы можете использовать CTE для получения ROW_NUMBER - любые дубликаты будут иметь ROW_NUMBER больше 1 (попробуйте это в тестовой копии базы данных, а не в рабочей):

; WITH AllRecords
AS (
    SELECT STK, yr, mn, dy, RowNum = ROW_NUMBER()OVER(PARTITION BY STK, yr, mn, dy ORDER BY STK)
    FROM Stock
    )
DELETE s
FROM Stock s
    JOIN [AllRecords] a
        ON s.STK = a.STK
        AND s.yr = a.yr
        AND s.mn = a.mn
        AND s.dy = a.dy
WHERE a.[RowNum] > 1;
0 голосов
/ 17 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...