Sql server 联合和联合所有结果
我试图理解这个结果: 为什么在情景2中我会得到100行的结果。 如果我只运行两个第一个查询的代码,我得到的结果是18行, 所以在计算2中,我希望得到109行的结果Sql server 联合和联合所有结果,sql-server,Sql Server,我试图理解这个结果: 为什么在情景2中我会得到100行的结果。 如果我只运行两个第一个查询的代码,我得到的结果是18行, 所以在计算2中,我希望得到109行的结果 SELECT FirstName,LastName --9 rows FROM employees UNION --UNION 1 SELECT FirstName,LastName --9 rows FROM employees UNION ALL
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和UNION ALL之间的基本区别是UNION操作会从结果集中消除重复的行,但UNION ALL会在联接后返回所有行。UNION语句有效地对结果集执行SELECTDISTINCT 联合 UNION命令用于从两个表中选择相关信息,与JOIN命令非常相似。但是,使用UNION命令时,所有选定的列都需要具有相同的数据类型。使用UNION时,仅选择不同的值 联合所有人 UNION ALL命令与UNION命令相同,只是UNION ALL选择所有值 Union和Union all之间的区别在于Union all不会消除重复的行,相反,它只是从符合查询细节的所有表中提取所有行,并将它们组合到一个表中 联合示例:
SELECT 'hello' AS world UNION SELECT 'hello' AS world ;
world
-------
hello
(1 row)
SELECT 'hello' AS world UNION ALL SELECT 'hello' AS world ;
world
-------
hello
hello
(2 rows)
联合所有示例:
SELECT 'hello' AS world UNION SELECT 'hello' AS world ;
world
-------
hello
(1 row)
SELECT 'hello' AS world UNION ALL SELECT 'hello' AS world ;
world
-------
hello
hello
(2 rows)
就你而言:
--Situation 2 UNION ALL UNION 100
在情况2中,UNION
将从第一个UNION ALL
中删除重复项
这就是为什么你会得到100张唱片而不是109张
SELECT 'hello' AS world UNION ALL SELECT 'hello' AS world UNION SELECT 'hello' AS world ;
world
-------
hello
(1 row)
如果您仍然需要所有行,这就是方法
SELECT 'hello' AS world UNION ALL (SELECT 'hello' AS world UNION SELECT 'hello1' AS world) ;
world
--------
hello
hello
hello1
(3 rows)
要接收109个结果,它意味着对所有子查询进行UNION ALL 在你的情况下,它意味着:
SELECT FirstName,LastName --9 rows
FROM employees
UNION **ALL** --UNION 1 *this is the change*
SELECT FirstName,LastName --9 rows
FROM employees
UNION ALL --UNION 2
SELECT companyName, contactName --91 rows
FROM Customers
我认为这里的大多数答案都没有抓住要点
显而易见的 UNION:组合两个或多个SELECT语句的结果集
- UNION中的每个SELECT语句必须具有相同数量的 纵队
- 列还必须具有类似的数据类型
- 每个SELECT语句中的列的顺序也必须相同
问题并不明显 在您的例子中,您正在使用UNION和UNIONALL联合多个查询 当RDBMS引擎遇到这种情况时,它将应用优先级:查询中的最后一个将应用于最后一个
- 如果联合在联合之后,联合将在最后应用
- 如果UNION ALL位于UNION之后,则UNION ALL将最后应用
select 1
UNION ALL
select 1
UNION
select 1
返回一行:
1
例2
select 1
UNION
select 1
UNION ALL
select 1
返回2行:
1
1
1
1
此优先规则的例外情况是,如果嵌入2个带括号的联合查询,在这种情况下,将首先应用嵌入包含:
SELECT 'hello' AS world UNION SELECT 'hello' AS world ;
world
-------
hello
(1 row)
SELECT 'hello' AS world UNION ALL SELECT 'hello' AS world ;
world
-------
hello
hello
(2 rows)
让我们修改前面的示例1:
select 1
UNION ALL
( select 1
UNION
select 1
)
返回2行:
1
1
1
1
参考资料:谢谢!我理解。但这意味着,当我想在2个或多个表之间使用UNIONALL时(我有多个表),我需要在所有查询中使用UNIONALL?是的。union all不是默认行为,因为通常情况下,您不希望在集合中出现重复项。