首页 > 解决方案 > Union 和 Union all - 结果

问题描述

我试图理解这个结果:为什么在情况 2 中我得到一个 100 行的结果。如果我只用 2 个第一个查询运行代码,我得到一个 18 行的结果,所以在情况 2 中我希望收到结果109行...?

      SELECT FirstName,LastName --9 rows
        FROM employees
       UNION --UNION 1
      SELECT FirstName,LastName  --9 rows
        FROM employees
      UNION ALL --UNION 2
      SELECT companyName, contactName --91 rows
        FROM Customers

--                     UNION 1         UNION 2     RESULT (# Rows)

--Situation 1          UNION          UNION          100
--Situation 2          UNION ALL      UNION          100
--Situation 3          UNION          UNION ALL      100
--Situation 4          UNION ALL      UNION ALL      109

标签: sql-server

解决方案


我认为这里的大多数答案都没有抓住重点


显而易见的

UNION:组合两个或多个 SELECT 语句的结果集。

  • UNION 中的每个 SELECT 语句必须具有相同数量的列
  • 列还必须具有相似的数据类型
  • 每个 SELECT 语句中的列也必须是相同的顺序

UNION ALL:默认情况下,UNION 运算符仅选择不同的值。要允许重复值,请使用 UNION ALL


不明显的

在您的情况下,您正在使用 UNION 和 UNION ALL 合并多个查询。

当 RDBMS 引擎遇到这种情况时,它会应用优先级:查询中的最后一个将最后应用。

  • 如果 UNION 出现在 UNION ALL 之后,则 UNION 将最后应用
  • 如果 UNION ALL 在 UNION 之后,则 UNION ALL 将最后应用

示例 1

select 1
UNION ALL 
select 1
UNION 
select 1

返回一行:

1

示例 2

select 1
UNION
select 1
UNION ALL
select 1

返回 2 行:

1
1

此优先规则的例外情况是,如果您使用括号嵌入 2 个 UNION 查询,在这种情况下,将首先应用嵌入包含:

让我们修改我们之前的示例 1:

select 1
UNION ALL 
( select 1
  UNION 
  select 1
)

返回 2 行:

1
1

参考:集合运算符 - UNION (Transact-SQL)


推荐阅读