如何从SQL表中删除所有重复的记录?
你好,我有表名FriendsData包含重复记录如下图所示如何从SQL表中删除所有重复的记录?
fID UserID FriendsID IsSpecial CreatedBy
-----------------------------------------------------------------
1 10 11 FALSE 1
2 11 5 FALSE 1
3 10 11 FALSE 1
4 5 25 FALSE 1
5 10 11 FALSE 1
6 12 11 FALSE 1
7 11 5 FALSE 1
8 10 11 FALSE 1
9 12 11 FALSE 1
我想用MS SQL删除重复的组合行?
从MS SQL FriendsData表中删除最新的重复记录。 在这里我附加了高亮显示重复列组合的图像。
我怎样才能去掉从SQL表中的所有重复的组合?
我不知道,如果语法是正确的对于MS-SQL,但在MySQL中,查询如下所示:
DELETE FROM FriendsData WHERE fID
NOT IN (SELECT fID FROM FriendsData
GROUP BY UserID, FriendsUserID, IsSpecial, CreatedBy)
在GROUP BY
条款你把你需要为了考虑两个记录复制
感谢@Constantin的好回复。 – 2011-06-15 05:08:24
不客气 - un upvote非常感谢:D – 2011-06-15 05:10:07
fID不包含在聚合函数或group by子句中。上面的sql语句是否按原样工作? – shashi 2011-09-22 16:53:47
尝试此查询相同的列,
select * from FriendsData f1, FriendsData f2
Where f1.fID=f2.fID and f1.UserID =f2.UserID and f1.FriendsID =f2.FriendsID
如果您返回重复的行,然后更换选择*通过“删除”
,将解决你的问题
但是不会删除重复集合中的所有行吗?我认为要求是要留下一个。 – 2011-06-15 11:54:30
这似乎违反直觉的,但你可以从一个共同的标签删除表达(在某些情况下)。所以,我会这样做:
with cte as (
select *,
row_number() over (partition by userid, friendsid order by fid) as [rn]
from FriendsData
)
delete cte where [rn] <> 1
这将保持最低fid的记录。如果你想要别的东西,可以在over子句中更改order by子句。
如果它是一个选项,请在表格中添加一个唯一性约束,这样您就不必一直这样做。如果你仍然有泄漏,它无助于救助船只!
感谢您的好回复..“查询丢失关键字...”与cte作为( 选择*, row_number()在(由用户ID分区,friendsid命令由FID)作为[朋友数据 ) 删除cte其中[rn] 1“我说得对吗? – 2011-06-21 04:52:55
啊,是的......我错过了CTE中的FROM子句。对不起,原文编辑。 – 2011-06-21 14:14:19
谢谢@ArsenMkrt – 2011-06-15 05:05:59
不客气@Abhishek – 2011-06-15 05:09:18
@Ahhishek:这留下最新的重复,而不是“删除最新的重复”,你在问题中陈述。 – 2011-06-15 05:09:20