sql-server - 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
解决方案
我认为这里的大多数答案都没有抓住重点
显而易见的
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
推荐阅读
- google-analytics - 谷歌分析:为什么目标完成没有显示在转换中
- matlab - 在文本文件中找到关键字,然后选择它旁边的值
- ios - 我无法保存用户输入并将其添加到 textFieldShouldRetrun 函数中的表到 Xcode 中的表中,我不知道为什么
- generator-expression - 如何在 python 中使用生成器表达式来创建奇数列表?
- apache-kafka - ksql - 从 json 数组创建流
- python - TypeError:“str”对象不能解释为整数纸牌游戏
- r - 为什么曲线拟合线杂乱无章?
- dart - 发生更改时如何在 Flutter 中重建小部件
- node.js - 将字体添加到 Puppeteer PDF 渲染器
- c++ - 有没有办法防止 libcurl 缓冲?