比较两个SQL Server表的比较查询

时间:2009-09-11 15:35:39

标签: sql sql-server tsql comparison

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

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

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

然后在比较表1和表2之后,它应该从Table2返回 Ruby Core。

9 个答案:

答案 0 :(得分:18)

迟到的答案,但对此线程的其他读者可能有用

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

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

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

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

答案 1 :(得分:17)

Select * from Table1
Except
Select * from Table2

它会显示table1table2

之间的所有不匹配记录

答案 2 :(得分:6)

如果从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

这是我的头脑 - 而且我有点生疏了。)

答案 3 :(得分:2)

如果您使用的是Sql server,请使用完整的连接。它与Murph所说的完全相同,只是在一个命令中。

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

答案 4 :(得分:2)

如果您确信数据的表达方式相同,则可以使用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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

(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)

答案 8 :(得分:-1)

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

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