SQL Server - 我有3个简单的表(Fname,Lname和Exceptions),每个表都有一个名为Name的列。我希望我的最终结果看起来像:( FName中的每个人和LName中的所有人) - (每个人都是例外)。
FName参数:
Name
A
B
LName的:
Name
Y
Z
例外:
Name
A
Z
预期查询结果集:
B
Y
当前SQL查询:
Select Name from Fname
UNION ALL
Select Name from Lname
WHERE Name NOT IN
(Select Name from Exceptions)
SQL查询仅适用于删除LName中但不包含在Fname中的数据。有人可以帮忙吗。
答案 0 :(得分:7)
UNION
的部分作为单独的查询处理,因此您可以将它们分组到子查询中:
SELECT Name
FROM (Select Name from Fname
UNION ALL
Select Name from Lname)sub
WHERE Name NOT IN (Select Name from Exceptions)
如果您不关心重复项,可以将其保留为UNION ALL
。
答案 1 :(得分:5)
你需要一个子查询,我更喜欢NOT EXISTS
:
SELECT X.name
FROM (SELECT name
FROM fname
UNION ALL
SELECT name
FROM lname) X
WHERE NOT EXISTS (SELECT 1
FROM exceptions E
WHERE x.name = E.name)
Should I use NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT, or NOT EXISTS?
但是,NOT IN
的工作方式相同:
SELECT X.name
FROM (SELECT name
FROM fname
UNION ALL
SELECT name
FROM lname) X
WHERE X.name NOT IN (SELECT name
FROM exceptions)
答案 2 :(得分:4)
如果您的RBBMS有(SQL Server或PostgreSQL有,不了解MySQL)
select Name from FName
union all
select Name from LName
except
select Name from Exceptions