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?
谢谢。
使用 CTE
和 row_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
.
我有 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?
谢谢。
使用 CTE
和 row_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
.