UNION ALL而不是在一起

Pat*_*ick 1 sql sql-server union sql-server-2008

SQL Server - 我有3个简单的表(Fname,Lname和Exceptions),每个表都有一个名为Name的列.我希望我的最终结果看起来像:( FName中的每个人和LName中的所有人) - (每个人都是例外).

FName参数:

Name
A
B
Run Code Online (Sandbox Code Playgroud)

LName的:

Name
Y
Z
Run Code Online (Sandbox Code Playgroud)

例外:

Name
A
Z
Run Code Online (Sandbox Code Playgroud)

预期的查询结果集:

B
Y
Run Code Online (Sandbox Code Playgroud)

当前的SQL查询:

Select Name from Fname
UNION ALL
Select Name from Lname
WHERE Name NOT IN
(Select Name from Exceptions)
Run Code Online (Sandbox Code Playgroud)

SQL查询仅适用于删除出现在LName但不出现在Fname中的数据.有人可以帮忙吗

Har*_* CO 7

a的各个部分UNION作为单独的查询处理,因此您可以将它们分组到子查询中:

SELECT Name 
FROM (Select Name from Fname
      UNION ALL
      Select Name from Lname)sub
WHERE Name NOT IN (Select Name from Exceptions)
Run Code Online (Sandbox Code Playgroud)

您可以保留它,就UNION ALL好像您不关心重复项一样.


Tim*_*ter 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) 
Run Code Online (Sandbox Code Playgroud)

演示

我应该使用NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT还是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) 
Run Code Online (Sandbox Code Playgroud)


Rom*_*kar 5

如果你的 RBBMS 除了(SQL Server 或 PostgreSQL 有,不知道 MySQL)

select Name from FName
union all
select Name from LName
except
select Name from Exceptions
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo