【问题标题】:UNION ALL and NOT IN togetherUNION ALL 和 NOT IN 在一起
【发布时间】:2013-08-24 09:27:40
【问题描述】:

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

F名称:

Name
A
B

L名称:

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

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        sql fiddle demo

        【讨论】:

        • MySQL 不支持EXCEPT
        • @HaralanDobrev OP 使用 SQL Server
        • 更多证明 postgreSQL 的摇滚。干杯!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多