任何人都可以建议我如何比较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
感谢。
答案 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)
答案 2 :(得分:1)
研究SQL EXCEPT
的使用SELECT Name, DOB
FROM Table1
EXCEPT
SELECT Name, DOB
FROM Table2
答案 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中的行,反之亦然。