【问题标题】:Comparison Query to Compare Two SQL Server Tables [duplicate]比较两个 SQL Server 表的比较查询 [重复]
【发布时间】:2010-11-27 13:18:24
【问题描述】:

我想知道如何比较两个不同的数据库表记录。我的意思是我将比较两个可能具有不同列名但数据相同的数据库表。但是其中一个可能比另一个有更多的记录,所以我想看看这两个表之间有什么区别。为此,如何编写 sql 查询?仅供参考:这两个数据库在同一个 SQL Server 实例下。

Table1
------+---------
|name |lastname|
------+---------
|John |rose    |
------+---------
|Demy |Sanches |
------+---------

Table2
------+----------
|name2|lastname2|
------+----------
|John |rose     |
------+----------
|Demy |Sanches  |
------+----------
|Ruby |Core     |
------+----------

那么在比较表1和表2后,应该返回Table2中的Ruby Core。

【问题讨论】:

  • 只是想澄清你的问题。您对以下哪一项感兴趣? 1. 列数据语义相同的表之间的列名差异? 2. 在一个表中但不在另一个表中的行? 3. 行相似,但在 X 列上可能不同? 4. 到底哪个表的记录多?

标签: sql sql-server tsql comparison


【解决方案1】:
Select * from Table1
Except
Select * from Table2

它将显示table1table2之间的所有不匹配记录

【讨论】:

  • 短而甜(有效)。正是我想要的。 +1
  • 考虑像这样使用union(Select * from Table1 Except Select * from Table2) UNION (Select * from Table2 Except Select * from Table1)。这将为您提供两个表中所有已删除或添加的行。
  • IMO slartidan 的工会评论是完整答案所必需的。如果没有联合,您的结果集将仅包含 table1 中不在 table2 中的值。添加联合会给你两个表中缺少的记录(如他所说)。
【解决方案2】:

迟到的答案,但可能对本主题的其他读者有用

除了其他解决方案,我还可以推荐名为 ApexSQL Data Diff 的 SQL 比较工具。

我知道您更喜欢不是基于软件的解决方案,但对于可能希望以更简单的方式执行此操作的其他访问者,我强烈建议您阅读这篇文章:http://solutioncenter.apexsql.com/how-to-compare-sql-server-database-tables-with-different-names/

本文介绍了如何使用 ApexSQL Data Diff 中的对象映射功能,这在两个表名称相同但列名不同的情况下特别有用。

要处理这种情况 - 需要手动映射每个列对,以便在比较 SQL 数据库表的差异时包含其中存储的数据。

【讨论】:

    【解决方案3】:

    如果您执行从 T1 到 T2 的外连接,您可以通过在 T2 值中查找空值来找到前者中不存在于后者中的行,类似地,从 T2 到 T1 的外连接将为您提供 T2 中的行。将两者结合在一起,你就会得到很多……比如:

    SELECT 'Table1' AS TableName, name, lastname FROM
        Table1 OUTER JOIN Table2 ON Table1.name = Table2.name2 
                                 AND Table1.lastname = Table2.lastname
    WHERE Table2.name2 IS NULL
    UNION
    SELECT 'Table2' AS TableName, name2 as name, lastname2 as lastname FROM
        Table2 OUTER JOIN Table1 ON Table2.name2 = Table1.name 
                                 AND Table2.lastname2 = Table1.lastname
    WHERE Table1.name IS NULL
    

    这不是我的想法 - 我有点生疏了:)

    【讨论】:

    • 让我试试你的方法。谢谢。
    【解决方案4】:

    如果您使用的是 Sql 服务器,请使用完全联接。它的作用与 Murph 所说的完全相同,但在一个命令中。

        SELECT 'Table1' AS TableName, name, lastname 
        FROM Table1 
    FULL JOIN Table2 ON Table1.name = Table2.name2 
                                     AND Table1.lastname = Table2.lastname
    

    【讨论】:

      【解决方案5】:

      如果您确信数据的表达方式相同,您可以使用CHECKSUM 函数。

      示例:

      if not OBJECT_ID('Table1', 'Table') is null drop table Table1
      if not OBJECT_ID('Table2', 'Table') is null drop table Table2
      create table table1
      ( id int identity(0, 1), 
         name varchar(128), 
         lastname varchar(128)
      )
      create table table2
      ( id int identity(0, 1), 
         name varchar(128), 
         lastname varchar(128)
      )
      insert into table1 (name, lastname) values ('John', 'rose')
      insert into table1 (name, lastname) values ('Demy', 'Sanches')
      insert into table2 (name, lastname) values ('John', 'rose')
      insert into table2 (name, lastname) values ('Demy', 'Sanches')
      insert into table2 (name, lastname) values ('Ruby', 'Core')
      
      select 
          table2.*
      from table1
           right outer join table2 on CHECKSUM(table1.name, table1.lastname) = CHECKSUM(table2.name, table2.lastname)
      where table1.id is null
      

      请参阅CHECKSUM MSDN topic 了解更多信息。

      【讨论】:

        【解决方案6】:

        试试dbForge Data Compare for SQL Server。它可以比较和同步任何数据库数据。快速、简单、始终提供正确的结果。看看它是如何在您的数据库中运行的!

        【讨论】:

          【解决方案7】:
          create table #test 
          (
              Sno INT IDENTITY(1,1),
              ExpDate VARCHAR(50),
              Amt INT,
              Amt1 INT,
              Amt2 INT,
              SumoAmt INT
          )
          
          create table #test1 
          (
              Sno INT IDENTITY(1,1),
              ExpDate VARCHAR(50),
              Amt INT,
              Amt1 INT,
              Amt2 INT,
              SumoAmt INT
          )
          
          INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,10,40)
          INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,20,50)
          INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,30,60)
          INSERT INTO #test(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',NULL,20,40,70)
          
          INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,10,40)
          INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,20,50)
          INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',10,20,30,60)
          INSERT INTO #test1(Expdate,Amt,Amt1,Amt2,SumoAmt) values ('30-07-2012',NULL,20,40,70)
          
          SELECT MIN(TableName) as TableName, Sno,Expdate,Amt,Amt1,Amt2,SumoAmt
          FROM
          (
            SELECT '#test' as TableName,Sno,Expdate,Amt,Amt1,Amt2,SumoAmt
            FROM #test
            UNION ALL
            SELECT '#test1' as TableName,Sno,Expdate,Amt,Amt1,Amt2,SumoAmt
            FROM #test1
          ) tmp
          GROUP BY Sno,Expdate,Amt,Amt1,Amt2,SumoAmt
          HAVING COUNT(*) = 1
          ORDER BY sno
          

          【讨论】:

          • 您应该考虑通过提供一些有关您正在做什么以及它如何回答 OP 的问题的详细信息来详细说明您的答案。
          【解决方案8】:

          如果你想要两个表的差异。

          (SELECT     *, 'in Table1' AS Comments
          FROM       Table1
          EXCEPT
          SELECT     * , 'in Table1' AS Comments
          FROM        Table2)
          UNION
          (SELECT     *, 'in Table2' AS Comments
          FROM       Table2
          EXCEPT
          SELECT     *, 'in Table2' AS Comments
          FROM        Table1)
          

          【讨论】:

            【解决方案9】:

            Firefly 将完全满足您的需求。它允许您构建两个 sql 语句,然后比较显示缺失行和数据差异的 sql 查询的结果。每个查询甚至可以来自不同的数据库,如 oracle / sql server。

            http://download.cnet.com/Firefly-Data-Compare-Tool/3000-10254_4-10633690.html?tag=mncol

            【讨论】:

            • 谢谢,但实际上我并不是在寻找可以做我想做的事情的软件。我想自己实现它。谢谢。
            • 链接已经失效了。
            猜你喜欢
            • 2012-08-01
            • 1970-01-01
            • 2017-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            相关资源
            最近更新 更多