我想知道如何比较两个不同的数据库表记录。我的意思是我将比较两个可能具有不同列名但数据相同的数据库表。但其中一个可能有比另一个更多的记录,所以我想看看这两个表之间的区别。要做到这一点,如何编写SQL查询?仅供参考:这两个数据库位于同一个SQL Server实例下。
Table1
------+---------
|name |lastname|
------+---------
|John |rose |
------+---------
|Demy |Sanches |
------+---------
Table2
------+----------
|name2|lastname2|
------+----------
|John |rose |
------+----------
|Demy |Sanches |
------+----------
|Ruby |Core |
------+----------
然后在比较表1和表2之后,它应该从Table2返回 Ruby Core。
答案 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
它会显示table1
和table2
答案 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