Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 联合和联合所有结果_Sql Server - Fatal编程技术网

Sql server 联合和联合所有结果

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

我试图理解这个结果: 为什么在情景2中我会得到100行的结果。 如果我只运行两个第一个查询的代码,我得到的结果是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和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 ALL


问题并不明显 在您的例子中,您正在使用UNION和UNIONALL联合多个查询

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

  • 如果联合在联合之后,联合将在最后应用
  • 如果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
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不是默认行为,因为通常情况下,您不希望在集合中出现重复项。