2011-06-15 140 views
5

你好,我有表名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表中删除最新的重复记录。 在这里我附加了高亮显示重复列组合的图像。

enter image description here

我怎样才能去掉从SQL表中的所有重复的组合?

回答

9

试试这个

DELETE 
FROM FriendsData 
WHERE fID NOT IN 
(
SELECT MIN(fID) 
FROM FriendsData 
GROUP BY UserID, FriendsID) 

here

或者here是更多的方式去做你想做的

希望这有助于

+0

谢谢@ArsenMkrt – 2011-06-15 05:05:59

+0

不客气@Abhishek – 2011-06-15 05:09:18

+1

@Ahhishek:这留下最新的重复,而不是“删除最新的重复”,你在问题中陈述。 – 2011-06-15 05:09:20

1

我不知道,如果语法是正确的对于MS-SQL,但在MySQL中,查询如下所示:

DELETE FROM FriendsData WHERE fID 
     NOT IN (SELECT fID FROM FriendsData 
        GROUP BY UserID, FriendsUserID, IsSpecial, CreatedBy) 

GROUP BY条款你把你需要为了考虑两个记录复制

+0

感谢@Constantin的好回复。 – 2011-06-15 05:08:24

+0

不客气 - un upvote非常感谢:D – 2011-06-15 05:10:07

+0

fID不包含在聚合函数或group by子句中。上面的sql语句是否按原样工作? – shashi 2011-09-22 16:53:47

0

尝试此查询相同的列,

select * from FriendsData f1, FriendsData f2 
    Where f1.fID=f2.fID and f1.UserID =f2.UserID and f1.FriendsID =f2.FriendsID 

如果您返回重复的行,然后更换选择*通过“删除”

,将解决你的问题

+0

但是不会删除重复集合中的所有行吗?我认为要求是要留下一个。 – 2011-06-15 11:54:30

3

这似乎违反直觉的,但你可以从一个共同的标签删除表达(在某些情况下)。所以,我会这样做:

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子句。

如果它是一个选项,请在表格中添加一个唯一性约束,这样您就不必一直这样做。如果你仍然有泄漏,它无助于救助船只!

+1

感谢您的好回复..“查询丢失关键字...”与cte作为( 选择*, row_number()在(由用户ID分区,friendsid命令由FID)作为[朋友数据 ) 删除cte其中[rn] <> 1“我说得对吗? – 2011-06-21 04:52:55

+0

啊,是的......我错过了CTE中的FROM子句。对不起,原文编辑。 – 2011-06-21 14:14:19