我需要删除每个表ID的所有重复项,除了一个。像下面这样。我需要删除01,02,03的valueid上的所有重复项...
原文:
id | valueid | data
____________________________
01 | 1001 | datadata1
01 | 1002 | datadata2
01 | 1001 | datadata1
02 | 1323 | datamoredata123
02 | 1323 | datamoredata123
03 | 22123 | evenmoredata
03 | 24444 | andalsomore
应以
结尾id | valueid | data
____________________________
01 | 1001 | datadata1
01 | 1002 | datadata2
02 | 1323 | datamoredata123
03 | 22123 | evenmoredata
03 | 24444 | andalsomore
试图用类似的方法做到这一点,但我不知道如何对ID上的删除分组
WITH CTE AS(
SELECT valueid,
RN = ROW_NUMBER()OVER(PARTITION BY valueid ORDER BY valueid)
FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1
有什么建议吗?
预先感谢
答案 0 :(得分:3)
您非常接近。您需要更改partition by
子句。您希望每对id
/ valueid
中有一行,因此它们都应该在partitioning子句中:
WITH todelete AS (
SELECT valueid,
RN = ROW_NUMBER() OVER (PARTITION BY id, valueid ORDER BY data)
FROM tblvalues
)
DELETE FROM todelete WHERE RN > 1;
答案 1 :(得分:3)
您需要将id
列添加到PARTITION
:
WITH CTE AS(
SELECT valueid,
RN = ROW_NUMBER()OVER( PARTITION BY id, valueid ORDER BY data)
FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1
这样,您将分别为每个valueid
删除重复的id
值。 data
列确定删除哪些重复项。
答案 2 :(得分:-1)
一种非常简单的方法是在(valueid)列中添加UNIQUE索引。编写ALTER语句时,请指定IGNORE关键字。
ALTER IGNORE TABLE tblvalues
ADD UNIQUE INDEX idx_name (valueid);
这将删除所有重复的行。另外一个好处是,将来重复的INSERT将是错误的。与往常一样,您可以在运行类似的操作之前进行备份。