联盟和全部联盟-结果

时间:2018-06-21 08:40:59

标签: sql-server

我试图了解此结果: 为什么我在情况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

4 个答案:

答案 0 :(得分:3)

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


显而易见

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查询,在这种情况下,将首先应用嵌入的include:

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

select 1
UNION ALL 
( select 1
  UNION 
  select 1
)

返回2行:

1
1

参考:Set Operators - UNION (Transact-SQL)

答案 1 :(得分:1)

UNION和UNION ALL之间的基本区别是联合操作从结果集中消除了重复的行,但联合全部在连接后返回了所有行。

答案 2 :(得分:0)

UNION语句有效地对结果集执行SELECT DISTINCT

UNION

UNION命令用于从两个表中选择相关信息,非常类似于JOIN命令。但是,使用UNION命令时,所有选定的列都必须具有相同的数据类型。使用UNION,只会选择不同的值。

全部联盟

UNION ALL命令与UNION命令相同,只是UNION ALL选择所有值。

Union和Union all之间的区别在于,Union all不会消除重复的行,而只是从所有符合您查询条件的表中提取所有行,并将它们组合成一个表。

UNION示例:

SELECT 'hello' AS world UNION SELECT 'hello' AS world ;
 world
-------
 hello
(1 row)

UNION ALL示例:

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)

答案 3 :(得分:0)

要接收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