2012-08-03 116 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使用的捷径。