Добавить 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
удалит только дубликаты записей