Ben*_* Z. 1 sql-server sql-server-2012
删除重复行时,使用本教程中的以下查询,我将如何强制删除找到的哪些重复行?
DELETE FROM dbo.ATTENDANCE
WHERE AUTOID NOT IN (SELECT MIN(AUTOID) _
FROM dbo.ATTENDANCE
GROUP BY EMPLOYEE_ID,ATTENDANCE_DATE)
Run Code Online (Sandbox Code Playgroud)
这很好用。我使用这个的原因是因为唯一可用的唯一 ID 是IDENTITY
列中的一个。为了确定是否有重复的行,我必须查看多列的组合。
但是,如果我有一组重复的行,我/SQL Server 如何决定删除哪些行?我将如何强制它删除除最高IDENTITY
值之外的所有内容?
EMPLOYEE_ID ATTENDANCE_DATE AUTOID
A001 2011-01-01 1
A001 2011-01-01 2
Run Code Online (Sandbox Code Playgroud)
如果我现在运行查询,它恰好删除了第二个,有AUTOID
2 个。但我试图删除除这个之外的所有内容(因为这是最新添加的)。
您可以实现一个查询,row_number()
用于删除除最新行之外的所有内容。这将按 对数据进行分区employee_id
并按autoId
列对其进行排序,然后删除大于第一行号的所有内容:
;with cte as
(
select [EMPLOYEE_ID], [ATTENDANCE_DATE], [AUTOID],
row_number() over(partition by [EMPLOYEE_ID], [ATTENDANCE_DATE]
order by [AUTOID] desc) rn
from dbo.ATTENDANCE
)
delete
from cte
where rn > 1;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13470 次 |
最近记录: |