我在 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 列进行分组/分区,然后删除它。
如何提取/删除相应的数据?
嗯,这比预期要容易得多。非常感谢汤姆的评论。我必须按 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
谢谢。