UNION ALL而不是在一起

时间:2013-08-21 20:29:11

标签: sql sql-server sql-server-2008 union

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中的数据。有人可以帮忙吗。

3 个答案:

答案 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) 

Demo

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

sql fiddle demo