2

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

姓名:

Name
A
B

姓名:

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

4

3 回答 3

8

a 的各个部分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好像你不关心重复一样。

于 2013-08-21T20:31:54.953 回答
6

你需要一个子查询,我更喜欢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) 

演示

我应该使用 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) 
于 2013-08-21T20:33:58.007 回答
5

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

select Name from FName
union all
select Name from LName
except
select Name from Exceptions

sql fiddle demo

于 2013-08-21T20:35:12.757 回答