1

谁能建议我如何比较 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

谢谢。

4

5 回答 5

5

很简单,使用 LEFT OUTER JOIN 从 Table2 中返回所有内容,即使 Table1 中没有匹配项,然后将其限制为只有没有匹配项的行:

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
于 2012-08-03T09:43:02.687 回答
1

在sql server中使用CHECKSUM()函数

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

细节

于 2012-08-03T09:42:54.147 回答
1

查看 SQL EXCEPT的使用

SELECT Name, DOB
FROM Table1
EXCEPT
SELECT Name, DOB
FROM Table2

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

于 2012-08-03T09:43:01.903 回答
1

你想要一个左外连接。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 使用的捷径。

于 2012-08-03T09:45:35.397 回答
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

输出将显示任何不同的行以及 Table1 中的行,但不显示 Table2 中的行,反之亦然。

于 2018-12-28T21:27:13.257 回答