比较两个sql server表

时间:2012-08-03 09:39:36

标签: sql sql-server

任何人都可以建议我如何比较sql server中的两个数据库表,并返回第二个表中不在第一个表中的行。两个表中的主键不一样。例如,表格如下。

表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查询应仅比较两个表中的Name和DoB并返回 31 James Anderson 14/04/2010

感谢。

5 个答案:

答案 0 :(得分:5)

非常简单,使用LEFT OUTER JOIN返回表2中的所有内容,即使Table1中没有匹配项,然后将其限制为只有匹配的行:< / p>

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

答案 1 :(得分:1)

在sql server中使用CHECKSUM()函数

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

Details

答案 2 :(得分:1)

研究SQL EXCEPT

的使用
SELECT Name, DOB
FROM Table1
EXCEPT
SELECT Name, DOB
FROM Table2

http://msdn.microsoft.com/en-us/library/ms188055.aspx

答案 3 :(得分:1)

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

这种类型的JOIN将返回'left'表(本例中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使用的捷径。

答案 4 :(得分:0)

此SQL语句无需指定列名即可比较两个表。

SELECT 'Table1' AS Tbl, binary_checksum(*) AS chksum, * FROM Table1
WHERE binary_checksum(*) NOT IN (SELECT binary_checksum(*) FROM Table2)
UNION
SELECT 'Table2' AS Tbl, binary_checksum(*) AS chksum, * FROM Table2
WHERE binary_checksum(*) NOT IN (SELECT binary_checksum(*) FROM Table1)
ORDER BY <optional_column_names>, Tbl

输出将显示所有不同的行和表1中的行,但不显示表2中的行,反之亦然。