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

Bud*_*Joe 10 sql t-sql sql-server-2005

如果UNION ALL是一个除了在T-SQL.减法的等价物是什么?

例如,如果我有一个表PEOPLE和一个表EMPLOYEES.而且我知道,如果我删除EMPLOYEES记录,PEOPLE我将离开我的公司CONTRACTORS.

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

Eri*_*ess 12

您可以使用EXCEPT运算符从另一个运算符中减去一个集合.这是使用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
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*m H 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
Run Code Online (Sandbox Code Playgroud)

对于SQL Server,这可能是您可以执行它的最高性能方式.

  • 这就是WHERE子句包含"E.ID IS NULL"的原因.在宣布出现问题之前,你应该理解它并理想地测试它. (3认同)

Cha*_*ana 11

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

msdn EXCEPT Sql2k8的链接

msdn除了Sql2k5的链接