如何修改TSQL查询以删除基于ORDER和ITEM拼接列的重复记录?
删除重复记录的SQL修改方案
场景说明
你有一张表,通过ORDER和ITEM列的组合可识别唯一记录。当前表中每个唯一组合都存在重复数据,你已用以下查询筛选出所有重复行(CN>1的记录):
原筛选重复行的查询
SELECT * FROM ( SELECT order + item AS ID, Row_Number() OVER(PARTITION BY order, item ORDER BY order) as CN FROM [schema].[table] ) AS Q WHERE Q.CN > 1
可直接修改为DELETE语句,以下是两种可行方案:
方案1:使用CTE(推荐,语法更清晰)
CTE(公共表表达式)可直接标记需要删除的行,执行删除操作:
WITH DuplicateRecords AS ( SELECT *, Row_Number() OVER(PARTITION BY [order], [item] ORDER BY [order]) as CN FROM [schema].[table] ) DELETE FROM DuplicateRecords WHERE CN > 1;
方案2:基于原嵌套子查询的关联删除
若想沿用原有子查询结构,可通过表关联方式删除重复行:
DELETE t FROM [schema].[table] t INNER JOIN ( SELECT [order], [item], Row_Number() OVER(PARTITION BY [order], [item] ORDER BY [order]) as CN FROM [schema].[table] ) Q ON t.[order] = Q.[order] AND t.[item] = Q.[item] WHERE Q.CN > 1;
关键注意点
ORDER是SQL保留关键字,建议用方括号[order]包裹列名,避免语法错误- 若需保留重复组中的特定行(比如最早/最晚创建的记录),可调整
ORDER BY子句,例如ORDER BY create_time DESC来保留最新的一行 - 执行删除前务必验证:可先把
DELETE替换成SELECT t.*,确认要删除的记录符合预期,防止误删数据
内容的提问来源于stack exchange,提问作者3PLanalyst
相关产品推荐
相关产品推荐

