如果UNION ALL
是T-SQL中的添加。减法的等价物是什么?
例如,如果我有一个表PEOPLE
和一个表EMPLOYEES
。我知道如果我从EMPLOYEES
删除PEOPLE
条记录,我将留在我的公司CONTRACTORS
。
有没有办法与UNION ALL
类似?我不需要指定任何字段名称的地方?我问的原因是这只是一个假设的例子。我需要对很多不同的表做几次这样的事情。假设EMPLOYEES
和PEOPLE
的架构是相同的。
答案 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只获取两者中的记录) 如
中所述答案 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/