2012-08-03 114 views
1

任何人都可以建議我如何比較sql server中的兩個數據庫表,並返回第二個表中不在第一個表中的行。兩個表中的主鍵都不相同。例如,表格如下。比較兩個sql服務器表

表1

ID    Name    DoB 
1    John Doe   20/03/2012 
2    Joe Bloggs   31/12/2011 

表2

ID    Name    DoB 
11    John Doe   20/03/2012 
21    Joe Bloggs   31/12/2011 
31    James Anderson  14/04/2010 

SQL查詢應該只比較名稱和DOB兩個表中,並返回 31詹姆斯 - 安德森14/04/2010

感謝。

+0

感謝您指出。我會從現在開始繼續。 – Vj87 2012-08-03 10:04:32

回答

5

很簡單的,使用LEFT OUTER加入返回一切fr OM表2即使沒有在表1匹配,則限制下降到只做行沒有有一個匹配:

SELECT Table2.ID, Table2.Name, Table2.DoB 
FROM Table2 
LEFT OUTER JOIN Table1 ON Table2.Name = Table1.Name AND Table2.DoB = Table1.DoB 
WHERE Table1.ID IS NULL 
+0

非常感謝 – Vj87 2012-08-03 09:59:55

1

使用校驗和()函數在SQL Server

select T1.* from Table1 T1 join Table2 T2 
on CHECKSUM(T1.Name,T1.DOB)!= CHECKSUM(T2.Name,T2.DOB) 

Details

+0

它每兩次返回匹配的行。然而,左外連接工作。謝謝 – Vj87 2012-08-03 10:07:20

1

你想要一個LEFT OUTER JOIN。 http://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join

即使連接表中沒有匹配的記錄,這種類型的JOIN將返回「左」表的所有記錄(本例中FROM子句中的表)。

SELECT Table2.ID, Table2.Name, Table2.DoB 
FROM Table2 
LEFT OUTER JOIN Table1 ON Table1.Name = Table2.Name AND Table1.DoB = Table2.DoB 
WHERE Table1.ID IS NULL 

請注意,您可以將LEFT OUTER JOIN替換爲LEFT JOIN。這是大多數DBMS使用的捷徑。