【问题标题】:Compare two sql server tables比较两个sql server表
【发布时间】:2012-08-01 08:24:43
【问题描述】:

谁能建议我如何比较 sql server 中的两个数据库表并返回第二个表中不在第一个表中的行。两个表中的主键不相同。例如,表格如下。

表1

ID             Name               DoB
1              John Doe           20/03/2012
2              Joe Bloggs         31/12/2011

表2

ID             Name                DoB
11             John Doe            20/03/2012
21             Joe Bloggs          31/12/2011
31             James Anderson      14/04/2010

sql 查询应该只比较两个表中的 Name 和 DoB 并返回 31 詹姆斯·安德森 14/04/2010

谢谢。

【问题讨论】:

  • 感谢您指出。从现在开始我会跟上。

标签: sql sql-server


【解决方案1】:

很简单,使用 LEFT OUTER JOIN 从 Table2 中返回所有内容,即使 Table1 中没有匹配项,然后将其限制为只有 有匹配项的行:

SELECT Table2.ID, Table2.Name, Table2.DoB
FROM Table2
LEFT OUTER JOIN Table1 ON Table2.Name = Table1.Name AND Table2.DoB = Table1.DoB
WHERE Table1.ID IS NULL

【讨论】:

    【解决方案2】:

    查看SQL的使用EXCEPT

    SELECT Name, DOB
    FROM Table1
    EXCEPT
    SELECT Name, DOB
    FROM Table2
    

    http://msdn.microsoft.com/en-us/library/ms188055.aspx

    【讨论】:

      【解决方案3】:

      你想要一个左外连接。 http://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join

      这种类型的 JOIN 将返回“左”表(本例中 FROM 子句中的表)的所有记录,即使连接表中没有匹配的记录。

      SELECT Table2.ID, Table2.Name, Table2.DoB
      FROM Table2
      LEFT OUTER JOIN Table1 ON Table1.Name = Table2.Name AND Table1.DoB = Table2.DoB
      WHERE Table1.ID IS NULL
      

      请注意,您可以将 LEFT OUTER JOIN 替换为 LEFT JOIN。这是大多数 DBMS 使用的捷径。

      【讨论】:

        【解决方案4】:

        在sql server中使用CHECKSUM()函数

        select T1.* from Table1 T1 join Table2 T2
        on CHECKSUM(T1.Name,T1.DOB)!= CHECKSUM(T2.Name,T2.DOB)
        

        Details

        【讨论】:

        • 它每次返回匹配的行两次。但是左外连接起作用了。谢谢
        【解决方案5】:

        此 SQL 语句无需指定列名即可比较两个表。

        SELECT 'Table1' AS Tbl, binary_checksum(*) AS chksum, * FROM Table1
        WHERE binary_checksum(*) NOT IN (SELECT binary_checksum(*) FROM Table2)
        UNION
        SELECT 'Table2' AS Tbl, binary_checksum(*) AS chksum, * FROM Table2
        WHERE binary_checksum(*) NOT IN (SELECT binary_checksum(*) FROM Table1)
        ORDER BY <optional_column_names>, Tbl
        

        输出将显示任何不同的行以及在 Table1 中的行,但不在 Table2 中,反之亦然。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-01
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多