Добавить DELETE в запрос, который возвращает повторяющиеся записи | SQL Server

Мне нужна ваша помощь.

У меня есть этот запрос, который обнаруживает дуплексные записи:

SELECT
    name, email, COUNT(*)
FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

Итак, мне нужно удалить результаты, поэтому я попробую это:

Delete FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

но не работает. Не могли бы вы мне помочь? поблагодарить.

3 ответа

Решение

Попробуйте этот запрос:

DELETE
FROM users
WHERE ID NOT IN
(SELECT MAX(ID)
FROM users
GROUP BY name, email)

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

;WITH CTE AS (
SELECT name
, email
, ROW_NUMBER() Over(Partition by name, email Order by(Select 1)) as Sno
FROM users
)
DELETE FROM CTE WHERE SNO>1

Я предполагаю, что вы хотите просто удалить дубликаты строк, а не все строки, относящиеся к дублирующимся строкам.

Вы можете использовать ROW_NUMBER здесь. Вы не предоставили всю схему для USERS таблица так вот пример

CREATE TABLE dbo.Users(
     Id INT IDENTITY(1,1)
    ,[Name] NVARCHAR(50)
    ,eMail NVARCHAR(50)
    ,DateCreated DATETIME
)

SELECT
     Id
    ,[Name]
    ,eMail
    ,DateCreated
    ,RN = ROW_NUMBER()OVER(PARTITION BY Name, eMail ORDER BY DateCreated ASC)  
FROM dbo.Users

вы можете изменить этот запрос на общее табличное выражение, а затем вы можете удалить его

;WITH cteDups
AS(
    SELECT
         Id
        ,[Name]
        ,eMail
        ,DateCreated
        ,RN = ROW_NUMBER()OVER(PARTITION BY Name, eMail ORDER BY DateCreated ASC)  
    FROM dbo.Users
)
DELETE FROM cteDups WHERE RN > 1

RN > 1 удалит только дубликаты записей

Другие вопросы по тегам