SQL Server删除表集中重复数据实例
在 SQL Server 数据库中,经常需要根据多个字段的组合条件来判断是否存在重复数据,并需要将其删除以维护数据完整性。本文将演示如何结合 ROW_NUMBER() 窗口函数与标准 DELETE 语句,精确识别并移除符合条件的重复行。
问题背景与结果目标
在实际业务场景中,“重复”往往由多个字段共同定义。例如:只要 companyName(公司名称)、invoiceNumber(发票号)和 customerNumber(客户号)三者都相同,即可判定为一条重复数据。
目标:保留每个“三字段组合”中的第一条记录,将剩余的重复项彻底删除,使数据集中不再存在重复组合。
准备条件与数据环境
我们将使用 SQL Server 的表变量作为测试数据集,创建一个名为 @InvoiceListMaster 的结构,包含自增主键 ID 以及上述三个核心字段和附加字段 rmaNumber。
第1步:构建包含重复数据的临时表结构
目的:初始化一个具有明确重复结构的测试环境。
- 定义表变量结构,指定
ID为自增主键。 - 插入多组模拟数据,确保部分行的
companyName、invoiceNumber和CustomerNumber完全一致。
declare @InvoiceListMaster table (
ID int identity primary key,
companyName Nchar(20),
invoiceNumber int,
CustomerNumber int,
rmaNumber int
)
-- 插入测试数据
insert @InvoiceListMaster
select N'华为', 1001,100,200
union all
select N'华为', 1001,100,300
union all
select N'华为', 1001,100,301
union all
select N'中兴', 1002, 200,1
union all
select N'中兴', 1002, 200,2
-- 检查初始状态
select * from @InvoiceListMaster
执行后,前 3 条记录的 companyName 均为 '华为',且发票号和客制号相同,属于待处理的重复组;后 2 条同理属于另一组重复。
真实操作顺序:实现去重
第2步:利用窗口函数标记重复位置
目的:为每组重复数据打上唯一的序号标签,以便区分“保留者”与“删除者”。
使用 ROW_NUMBER() 函数,基于 companyname、invoicenumber 和 customerNumber 进行分区(Partition By),并按默认顺序生成递增序号(Rown)。
第3步:执行 DELETE 删除多余行
目的:只针对序号大于该组最小序号的行执行删除操作。
- 入口与逻辑: 对临时表进行一次内部查询,计算出每行在其重复组中的序列号。
- 动作: 使用
EXISTS子句判断:如果某行的rown大于同组内其他行的rown(即存在比它更靠前的记录),则该行即为重复数据。 - 参数: 关联条件为三字段值完全相等。
DELETE A
from (
select rown = ROW_NUMBER( )over( partition by companyname, invoicenumber, customerNumber order by companyname, invoicenumber, customerNumber ),
companyname, invoicenumber, customerNumber
from @InvoiceListMaster )a
where exists ( select 1
from ( select rown = ROW_NUMBER( )over( partition by companyname, invoicenumber, customerNumber order by companyname, invoicenumber, customerNumber ),
companyname, invoicenumber, customerNumber
from @InvoiceListMaster ) b
where b.companyName = a.companyName
and b.invoiceNumber = a.invoiceNumber
and b.CustomerNumber = a.CustomerNumber
and a.rown > b.rown
)
注意:由于窗口函数的特性,在此处我们依赖子查询的结果进行过滤。此写法直接作用于内存表变量或视图化的查询结果。
第4步:验证最终结果
目的:确认重复数据已被安全清除,且每组保留了唯一的一条基准记录。
select * from @InvoiceListMaster
执行后,预期结果为:华为组仅保留 rmaNumber=200 的那一行(假设它是第一顺位被读取/写入的),其余重复项已消失。
完成判断与简要总结
完成判断:再次执行 SELECT COUNT(*) 对比行数变化,或观察同一组特征值的记录数是否降为 1。若所有组合的唯一性得到保证,即操作成功。
总结:本实例展示了在 SQL Server 环境下不依赖外部程序或游标,纯依靠 T-SQL 内置的 ROW_NUMBER() 窗口函数高效处理重复数据的方案。这种方法灵活且性能优异,适合大多数基于多字段判重的场景。
以上就是 SQL Server 数据库删除数据集中重复数据实例讲解的详细内容,更多关于 SQL Server 数据处理优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













