MSSQL中删除同一Object下重复Property数据的实现方法
MSSQL 删除同一ObjectID下重复Property数据的解决方案
问题分析
你之前的CTE查询未达预期,核心原因是分区条件错误:仅按Property分区无法区分不同ObjectID下的相同属性,必须同时按ObjectID和Property分区,才能精准定位同一对象内的重复属性行。
提取待删除数据的方法
使用CTE结合ROW_NUMBER(),按ObjectID+Property分组,对每组内的行按PropertyID升序编号,编号大于1的就是需要删除的重复行:
WITH CTE AS( SELECT PropertyID, ObjectID, Property, RN = ROW_NUMBER() OVER(PARTITION BY ObjectID, Property ORDER BY PropertyID ASC) FROM t_objectproperties ) SELECT * FROM CTE WHERE RN > 1
执行后会返回ID2、ID3这两行待删除数据。
直接删除重复数据的方法
方法1:基于CTE的删除
MSSQL支持直接对可更新CTE执行删除操作,只需在CTE中保留PropertyID和行号,即可定位并删除重复行:
WITH CTE AS( SELECT PropertyID, RN = ROW_NUMBER() OVER(PARTITION BY ObjectID, Property ORDER BY PropertyID ASC) FROM t_objectproperties ) DELETE FROM CTE WHERE RN > 1
方法2:关联子查询删除
通过子查询判断当前行是否存在同一ObjectID、同一Property且PropertyID更小的行,若存在则删除当前行:
DELETE t1 FROM t_objectproperties t1 WHERE EXISTS ( SELECT 1 FROM t_objectproperties t2 WHERE t2.ObjectID = t1.ObjectID AND t2.Property = t1.Property AND t2.PropertyID < t1.PropertyID )
内容的提问来源于stack exchange,提问作者Aleator7th
相关产品推荐
相关产品推荐

