T-SQL:比较两个表 - 第二个表中不存在的记录

时间:2008-12-16 18:00:30

标签: sql sql-server-2005 tsql

如果UNION ALL是T-SQL中的添加。减法的等价物是什么?

例如,如果我有一个表PEOPLE和一个表EMPLOYEES。我知道如果我从EMPLOYEES删除PEOPLE条记录,我将留在我的公司CONTRACTORS

有没有办法与UNION ALL类似?我不需要指定任何字段名称的地方?我问的原因是这只是一个假设的例子。我需要对很多不同的表做几次这样的事情。假设EMPLOYEESPEOPLE的架构是相同的。

7 个答案:

答案 0 :(得分:12)

您可以使用EXCEPT operator从另一个中减去一个集合。这是使用EMPLOYEES和PEOPLE临时表的代码示例。据我所知,您需要在EXCEPT运算符中使用字段名称。

CREATE TABLE #PEOPLE
(ID INTEGER,
 Name NVARCHAR(50))

CREATE TABLE #EMPLOYEE
(ID INTEGER,
 Name NVARCHAR(50))
GO

INSERT #PEOPLE VALUES (1, 'Bob')
INSERT #PEOPLE VALUES (2, 'Steve')
INSERT #PEOPLE VALUES (3, 'Jim')
INSERT #EMPLOYEE VALUES (1, 'Bob')
GO

SELECT ID, Name
FROM #PEOPLE
EXCEPT 
SELECT ID, Name
FROM #EMPLOYEE
GO

最终查询将返回PEOPLE表中的两行,这两行在EMPLOYEE表中不存在。

答案 1 :(得分:11)

SELECT
     P.*
FROM
     People P
LEFT OUTER JOIN Employees E ON
     E.ID = P.ID     -- Or whatever your PK-FK relationship is
WHERE
     E.ID IS NULL

对于SQL Server,这可能是您可以做到的最高效的方式。

答案 2 :(得分:11)

不使用UNION,而是使用EXCEPT,(或INTERSECT只获取两者中的记录) 如

中所述

msdn EXCEPT Link for Sql2k8

msdn EXCEPT Link for Sql2k5

答案 3 :(得分:3)

SELECT * FROM Table1
WHERE Table1.Key NOT IN (SELECT Table2.Key FROM Table2 WHERE Table2.Key IS NOT NULL)

添加了IS NOT NULL以使人们满意。

我同意汤姆的观点。他的版本很可能更有效率。使用我的唯一可能的原因可能是它更漂亮。

答案 4 :(得分:1)

很遗憾,您的设计存在问题。 而不是有两个表PEOPLE和CONTRACTOR。 你应该有一个表PEOPLE和另一个表类型(如果有些人可以有几个角色,可能需要另一个表)。 在您的PEOPLE表中,您可以参考TYPE表。

然后你要求成为

SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id 
AND TYPE.name = 'CONTRACTOR'

SELECT * from PEOPLE, TYPE
WHERE PEOPLE.type_id = TYPE.id 
AND TYPE.name = 'EMPLOYEE'

(未测试的)

答案 5 :(得分:1)

当我比较查找不在另一个中的数据的表时,我通常使用SQL Division。

select *(or selected matching field) 
from tableA as A
where not exist
(select *(or selected matching field) 
from tableB as B 
where A.key = B.key)

此查询将返回tableA中未通过除法过程的结果。

select *(or selected matching field) 
from tableA as A
where exist
(select *(or selected matching field) 
from tableB as B 
where A.key = B.key)

此查询将返回两个表中匹配的所有数据行,因此如果tableA中的行数据不在tableB中,则不会检索到该行数据。

答案 6 :(得分:0)

我发现使用像SQLMerger这样的工具为你做这件事要容易得多。结果以更好的方式显示,您可以轻松地继续处理您需要处理的任何数据。

www.auisoft.com/SQLMerger< =可以轻松比较数据的工具

比较两个表的示例:http://auisoft.com/SQLMerger/How-to/visualize-differences-in-2-databases/