【问题标题】:How can I compare two tables and delete the duplicate rows in SQL?如何比较两个表并删除 SQL 中的重复行?
【发布时间】:2010-10-10 08:58:36
【问题描述】:

我有两个表,如果第二个表中存在行的精确副本,我需要从第一个表中删除行。

有没有人有我将如何在 MSSQL 服务器中执行此操作的示例?

【问题讨论】:

    标签: sql sql-server duplicate-data


    【解决方案1】:

    嗯,在某些时候,您将不得不检查所有列 - 不妨加入...

    DELETE a
    FROM a  -- first table
    INNER JOIN b -- second table
          ON b.ID = a.ID
          AND b.Name = a.Name
          AND b.Foo = a.Foo
          AND b.Bar = a.Bar
    

    应该这样做...还有CHECKSUM(*),但这只是帮助 - 您仍然需要检查实际值以排除哈希冲突。

    【讨论】:

    • 只要没有任何列包含空值,它就可以很好地工作。一旦发生这种情况,您就必须开始为每个可空列处理复杂的条件,例如 (a.Name = b.Name OR (a.Name IS NULL AND b.Name IS NULL))。避免空值的另一个原因。
    • @Marc Gravell,如果表 a 和表 b 出现在 view 中。那么我怎样才能删除重复的行并保持原来的一次呢?我已经在这种情况下发布了 [stackoverflow.com/questions/32065340/…
    • 对这些类型的操作使用 INTERSECT 和 EXCEPT(见其他答案)可以避免 NULL 问题sqlblog.com/blogs/paul_white/archive/2011/06/22/…
    【解决方案2】:

    我认为下面的伪代码会做到这一点..

    DELETE FirstTable, SecondTable
    FROM FirstTable
    FULL OUTER JOIN SecondTable
    ON FirstTable.Field1 = SecondTable.Field1
    ... continue for all fields
    WHERE FirstTable.Field1 IS NOT NULL
    AND SecondTable.Field1 IS NOT NULL
    

    不过,Chris 的 INTERSECT 帖子要优雅得多,我以后会使用它,而不是写出所有的外部连接条件 :)

    【讨论】:

      【解决方案3】:

      我会尝试 DISTINCT 查询并合并两个表。

      您可以使用 asp/php 之类的脚本语言将输出格式化为一系列插入语句,以重建表生成的唯一数据。

      【讨论】:

        【解决方案4】:

        如果您使用的是 SQL Server 2005,则可以使用intersect

        delete * from table1 intersect select * from table2
        

        【讨论】:

          【解决方案5】:

          试试这个:

          DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id
          

          【讨论】:

            猜你喜欢
            • 2011-04-05
            • 2020-10-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-31
            • 2022-01-25
            • 2021-12-09
            • 2013-02-02
            相关资源
            最近更新 更多