2009-09-11 114 views
3

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

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

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

然后,当比对表1和表2之后,它应该从表2返回Ruby内核。

+1

只是想澄清你的问题。您对以下哪一项感兴趣? 1.列名与列数据在语义上相同的表之间的差异? 2.行列在一张表中,但不在另一张表中? 3.行数相似,但在X列数上可能不同? 4.哪张表有更多的记录? – Scanningcrew 2009-09-11 15:56:25

+0

好的,我编辑了这个问题。 – Tarik 2009-09-11 16:36:31

回答

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 

这是从我的头顶 - 我有点生疏了:)

+0

让我试试你的方法。谢谢。 – Tarik 2009-09-13 00:55:42

-1

萤火虫会做什么你”重新寻找。它可以让你建立两个sql语句,然后比较显示缺失行和数据差异的sql查询结果。每个查询甚至可以来自不同的数据库,如oracle/sql server。

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

+0

谢谢,但实际上我不是在寻找可以做我想做的软件。我想自己实现它。谢谢。 – Tarik 2009-09-13 00:57:09

+0

该链接现在已经死亡。 – 2015-03-23 19:43:49

2

如果您使用的是Sql服务器,请使用完全连接。它和Murph所说的完全一样,只是在一个命令中。

SELECT 'Table1' AS TableName, name, lastname 
    FROM Table1 
FULL JOIN Table2 ON Table1.name = Table2.name2 
           AND Table1.lastname = Table2.lastname 
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

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 
+1

你应该考虑详细说明你的答案,提供一些关于你在做什么以及如何回答OP的问题的细节。 – forsvarir 2012-07-30 12:29:47

16
Select * from Table1 
Except 
Select * from Table2 

它会显示table1table2

+0

短而甜(有效)。正是我想要的。 +1 – davidXYZ 2013-04-03 21:23:43

+0

美丽...... :) – ABH 2014-02-21 07:30:12

+4

考虑使用'union'像这样:'(从表1中选择*除了从表2中选择*)UNION(从表2中选择*除了从表1中选择*)''。这会给你在这两个表中的任何删除或添加的行。 – slartidan 2014-12-03 15:15:31

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

晚答案,但可以此主题

除了其他解决方案的其他读者有用,我可以推荐所谓ApexSQL数据DIFF SQL比较工具。

我知道你宁愿解决方案不是基于软件,但对于其他游客,谁可能希望这样做的一个简单的方法,我强烈建议阅读这篇文章:http://solutioncenter.apexsql.com/how-to-compare-sql-server-database-tables-with-different-names/

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

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