删除一组组内的重复项[重复项]

问题描述 投票:0回答:1

我在 MSSQL 数据库中有一个表 t_objectproperties,如下所示

房产ID 对象ID 财产
ID1 对象1 财产1
ID2 对象1 财产1
ID3 对象1 财产1
ID4 对象2 财产1

我想删除同一对象中某个属性的所有重复项。因此,应删除行 (ID2、Object1、Property1 AND ID3、Object1、Property1),而不得删除行 (ID1、Object1、Property1 AND ID4、Object2、Property1)。 我总是想保留同一个对象中多个属性中最低的 PropertyID。

到目前为止我尝试了以下代码但没有得到满意的结果。 (我尝试使用 SELECT 而不是 DELETE,以首先确认我的陈述是正确的)

WITH CTE AS(
   SELECT t_objectproperties.Property, t_objectproperties.ObjectID, t_objectproperties.PropertyID,
       RN = ROW_NUMBER()OVER(PARTITION BY t_objectproperties.Property ORDER BY t_objectproperties.PropertyID ASC)
   FROM t_objectproperties
)
SELECT * FROM CTE WHERE RN > 1

如果我按 ObjectID 分区,结果会有所不同,但仍然不是我想要的。

我进一步尝试使用以下语句提取正确的数据格式。

SELECT t_objectproperties.ObjectID, t_objectproperties.Property, count(*)
From t_objectproperties
Group by t_objectproperties.ObjectID, t_objectproperties.Property

虽然 groupy by 正确提取数据,但我无法使用该语句删除我的行。不知何故,我需要将这两个语句结合起来。

我在这里和谷歌上找到了很多答案,但他们从来不想按 3 列进行分组/分区,然后删除它。

如何提取/删除相应的数据?

sql-server duplicates sql-delete
1个回答
1
投票

嗯,这比预期要容易得多。非常感谢汤姆的评论。我必须按 ObjectID 和 Property 进行分区。下面的代码很有魅力。

WITH CTE AS(
   SELECT t_objectproperties.Property, t_objectproperties.ObjectID, t_objectproperties.PropertyID,
       RN = ROW_NUMBER()OVER(PARTITION BY t_objectproperties.ObjectID, t_objectproperties.Property ORDER BY t_objectproperties.PropertyID ASC)
   FROM t_objectproperties
)
Delete FROM CTE WHERE RN > 1

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.