SQL 服务器:删除没有唯一 ID 的重复行

SQL Server : delete duplicate rows without Unique ID

我有 table 并且它有这些列:

pkID    int 
Title   varchar(255)    
FromEmail   varchar(500)    
ToEmail varchar(500)    
CCEmail varchar(500)    
BCCEmail    varchar(500)    
Subject varchar(500)    
EmailBody   ntext   
EmailFields varchar(5000)   

我的 table 有 4 行 数据与下面的值相同

pkID 44

Title 'Notification'

FromEmail NULL

ToEmail NULL

CCEmail NULL

BCCEmail NULL

Subject 'Send Email for Notification'

EmailBody NULL

EmailFields NULL

我的 table 名字是 EmailTemplates

如果我尝试这个查询:

;WITH cte
(
    SELECT
        *, ROW_NUMBER() OVER (ORDER BY pkID) RN 
    FROM EmailTemplates
    WHERE pkID = 44
)
DELETE FROM cte 
WHERE RN > 1

我收到这个错误:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'select'.

Msg 102, Level 15, State 1, Line 6
Incorrect syntax near ')'.

我想删除 pkID 等于 44 它将删除 4 行,所以我如何 删除 3 行 pkID 等于 44

谢谢。

使用 CTErow_number 删除重复项

;with cte as
(
select *,row_number() over(order by pkID) RN 
FROM yourtable
where pkID = 44
)
delete from cte where RN>1

注意:在order by中你可以提到你想删除的order中的duplicates

您可以使用 CTE 和 ROW_NUMBER。它允许轻松更改它以查看哪些行被删除(或更新),因此只需将 DELETE FROM CTE... 更改为 SELECT * FROM CTE:

WITH CTE AS(
   SELECT e.*,
       RN = ROW_NUMBER() OVER (PARTITION BY pkID ORDER BY pkID)
   FROM dbo.EmailTemplates e
   WHERE pkID = @pkID -- if you want to delete only a specific ID
)
DELETE FROM CTE WHERE RN > 1 

如果您删除 WHERE pkID = @pkID,您将删除所有重复项,因为每个 pkID 始终保留一行。因此,如果您想将逻辑更改为更有意义的内容,则需要将 ORDER BY pkID 更改为不同的内容,目前它是任意的。

如果要考虑多列,只需要将PARTITION BY pkID改为(f.e.)PARTITION BY pkID, Title.