我有一张应该有唯一键的表。我根据另一个键(Col1)的唯一性生成一个键(Col2)。现在,发生了一些事情,我在Col2中有唯一的键,但在Col1中重复了一些数据。对于instanse,我们有
我希望自动删除值为DB02的行,并保留DB01。因为02大于01,我想保持最低值(尽管它包含字符)。
你能帮我查询一下吗?
这是我尝试的查询的图片,以及我没有得到的结果。 :(
答案 0 :(得分:2)
您可以使用CTE
执行DELETE
:
;WITH ToDelete AS (
SELECT ROW_NUMBER() OVER (PARTITION BY Col2 ORDER BY Col1) AS rn
FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1
ROW_NUMBER
窗口函数用于枚举每个Col2
分区中的记录。具有最低Col1
值的记录被赋值为rn = 1
。所有其他记录都有rn > 1
并已删除。
答案 1 :(得分:0)
答案类似于Giorgos Betsos的建议,但代码应该是这样的:
WITH ToDelete AS (
SELECT Col2 ,ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1) AS rn
FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1