2009-09-11 156 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數據庫表中的差異時,將存儲在其中的數據包括在內。