【问题标题】:How to delete all duplicate records from SQL Table?如何从 SQL 表中删除所有重复记录?
【发布时间】:2011-09-15 05:47:21
【问题描述】:

您好,我的表名 FriendsData 包含重复记录,如下所示

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 表中删除所有重复的组合?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2005 duplicates


    【解决方案1】:

    试试这个

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

    here

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

    希望对你有帮助

    【讨论】:

    • @Abhishek:这会留下最新的副本,而不是您在问题中所说的“删除最新的副本”。
    • 好的@OMG 我明白了。如果我在上面的查询中将 Max() 替换为 Min() ,那么它会从 SQL 表中删除最新的重复记录。我说的对吗?
    • 您好@arsenmkrt,我在您的查询中将 Max() 替换为 Min() 然后它会删除所有最新的重复记录。我说的对吗?
    • 也试试加入:),你可以试试我的回复,不管你有没有标记这个答案:) 可以更快!!
    • 我知道它很旧但是为了记录,您需要更改 SQL 才能在 mysql 中工作,因为错误 1093 (错误代码:1093. You can't specify target table 'xxx' for在 FROM 子句中更新)最终的 sql 应该是这样的:DELETE FROM FriendsData WHERE fID NOT IN ( SELECT fID from ( SELECT MIN(fID) AS fID FROM FriendsData GROUP BY UserID, FriendsID ) as something )
    【解决方案2】:

    这似乎违反直觉,但您可以从公用表表达式中删除(在某些情况下)。所以,我会这样做:

    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 为 (select *, row_number() over (partition by userid, friendsid order by fid) as [rn] FROM FriendsData )删除 cte where [rn] 1 " 我是对的吗?
    • 啊是的...我错过了 CTE 中的 FROM 子句。对此感到抱歉;原帖已编辑。
    【解决方案3】:

    我不知道 MS-SQL 的语法是否正确,但在 MySQL 中,查询看起来像:

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

    GROUP BY 子句中,您需要放置相同的列,以便考虑两条记录重复

    【讨论】:

    • fID 不包含在聚合函数或 group by 子句中。上面的sql语句会按原样工作吗?
    【解决方案4】:

    试试这个查询,

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

    如果它返回重复的行,则将 Select * 替换为“Delete”

    这会解决你的问题

    【讨论】:

    • 但这不会删除重复集中的所有行吗?我认为要求是留下一个。
    【解决方案5】:

    在 Postgres 中工作:

    DELETE from "FriendsData" where "fID" in
       (SELECT "fID" from
            (SELECT *, ROW_NUMBER() OVER(PARTITION BY "UserID", "FriendsID" ORDER BY  "fID") as rn
        FROM "FriendsData") as inner1
    WHERE rn > 1);
    

    【讨论】:

    • 您好,感谢您的回答。它对您很有用,但如果您能解释一下您做了什么以及您是如何解决最初的问题的,那将对我们有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多