【问题标题】:What is the use of "Union all"?“联合所有”有什么用?
【发布时间】:2019-10-23 04:12:08
【问题描述】:

我不是在问它们之间的区别,我的问题是我们什么时候需要使用“Union All”?

【问题讨论】:

  • 谢谢,您的所有回答都说只有两个要点 1.) 重复行和 2)。表现。这意味着我们可以使用其中任何一个,所以我不明白为什么我们不能在这个查询中使用联合。 with tempData as ( select 32 as col1, char(32) as col2 union all select col1+1, char(col1+1) from tempData where col1
  • @Jeevan Bhatt - 当您在查询中使用“UNION”而不是“UNION ALL”时会发生什么?您使用的是什么数据库?
  • @Jeevan Bhatt - 看了你的查询,我相信有一些语法错误阻止它执行。 CTE 中的第一个子查询缺少 FROM 子句,第二个子查询引用 CTE 内的 CTE,这是不允许的。您的查询试图完成什么?
  • @Bob- 我使用的是 SQL Server 2008,如果我使用“union”而不是“union all”,则会出现错误:递归公用表表达式“tempData”不包含顶级UNION ALL 运算符。
  • @Jeevan Bhatt - 显然 SQL Server 2008 允许递归 CTE,但我只有 Oracle 进行测试,似乎 Oracle 不允许递归 CTE。因此,我在这里帮不上什么忙。但是,错误消息似乎表明在 SQL Server 2008 中,递归 CTE 中的第一个 UNION 运算符必须是 UNION ALL。祝你好运。

标签: sql


【解决方案1】:

当您确实需要多个“副本”行时,您将使用 UNION ALL,否则在使用 UNION 时会删除这些行。它在查询端也可以更快,因为数据库引擎不需要确定结果集之间的重复项。

【讨论】:

  • +1 用于提及性能 - 这几乎是至关重要的,需要了解 UNION 与 UNION ALL 对更大表的影响,其中 UNION 对大型结果集的执行速度要比 UNION ALL 慢几个数量级(因为在大多数情况下删除重复项意味着建立临时索引;对于较小的结果集,这不会那么昂贵,结果集的大小是返回的行数
  • 我会说“可以容忍”多个副本,而不是“需要”。例如,当您说WHERE ForeignKey IN (SELECT Id FROM view1 UNION ALL SELECT Id FROM view2) 时。你不需要两个都需要,但是你可以容忍两个
  • “当您确实需要行的多个“副本”时[...]”:在什么情况下会这样?能举个例子吗?
【解决方案2】:
  • UNION 将删除重复项
  • UNION ALL删除重复项

例子

SELECT 1 AS foo
UNION
SELECT 1 AS foo

= one row

SELECT 1 AS foo
UNION ALL
SELECT 1 AS foo

= two rows

【讨论】:

  • 如果你做了很多 JOIN 并且有多余的行,你会使用 GROUP BY 而不是 UNION 吗? UNION 和 DISTINCT 有什么区别?
  • @meder:删除重复项的 GROUP BY 是滥用:它用于聚合。 DISTINCT 是每个 SELECT 的。也就是说,如果需要,我可以选择 DISTINCT.. UNION ALL SELECT ...。这意味着删除重复的第一个子句,但将所有行放在 UNION 上。
  • 投了反对票,因为 OP 说“我不是在问他们之间的区别”
【解决方案3】:

举个例子就清楚了:

mysql> select * from tmp1;
+------+
| a    |
+------+
| foo1 |
| foo2 |
+------+
2 rows in set (0.00 sec)

mysql> select * from tmp2;
+------+
| a    |
+------+
| foo2 |
| foo3 |
| foo4 |
+------+
3 rows in set (0.00 sec)

mysql> select * from tmp1 union select * from tmp2;
+------+
| a    |
+------+
| foo1 |
| foo2 |   # DUPLICATES REMOVED.
| foo3 |
| foo4 |
+------+
4 rows in set (0.00 sec)

mysql> select * from tmp1 union all select * from tmp2;
+------+
| a    |
+------+
| foo1 |
| foo2 |
| foo2 |    # DUPLICATES NOT REMOVED.
| foo3 |
| foo4 |
+------+
5 rows in set (0.00 sec)

关于何时使用UNION ALL?

的问题

如果您不关心结果集是否有重复行,或者如果您知道不会有任何重复行,请使用 UNION ALL 而不是 UNION

【讨论】:

    【解决方案4】:

    因为结果将是一个表,并且每个表都应该有一个键,并且UNION 确保唯一的行,所以理论上您应该始终使用UNION。但是,因为UNION ALL 不能确保唯一的行,UNION ALL 可以更好地执行,因此如果您可以确定两个表都已经包含唯一的行,那么在实践中可能是首选。

    同样的逻辑适用于SELECT DISTINCTSELECT ALL 之间的选择,顺便说一句。

    【讨论】:

      【解决方案5】:

      何时需要使用它们取决于您的要求。 UNION 和 UNION ALL 的区别在于 UNION ALL 不会删除重复的行。

      【讨论】:

      • 我不是在问他们之间的区别
      • 哇。我没想到将近 10 年后会对此发表评论:)。您对 UNION 仍有疑问,我可以帮助您解决吗?
      【解决方案6】:

      Union all 用于将多个数据集连接成一个数据集,但不会删除重复项

      【讨论】:

        【解决方案7】:

        当两个结果集具有相同的列(数字和类型)时,您可以使用 UNION ALL 将它们连接(附加)成一个结果集。

        【讨论】:

          【解决方案8】:

          当我们不需要从记录集中排除重复行时

          【讨论】:

            【解决方案9】:

            除了重复性差异和性能之外,应该考虑的情况是,当您期望合并的结果在本质上完全不同,但可以在操纵时给出共同的结果,例如。

                Select name from table
                 Union all
                Select max(name) from table
            
                  Vs
            
                 Select name from table
                 Union 
                Select max(name) from table
            

            如果您的 max(name) 与 name 相同,则 union 将给出一条记录,而 union all 将给出两条记录。但是,如果我应该知道名称的最大值与列表中某个特定名称的最大值相同,那么就去联合所有。我的意思是这是非常基本的场景。在连接语句的情况下,Union all 可能会产生很多差异,这些语句通常可以设置为不同的,但会导致操作的共同结果

            【讨论】:

              【解决方案10】:

              默认情况下,UNION 将消除重复值。如果您将 UNION 替换为 UNIONALL,那么它将不再消除重复值。 :)

              【讨论】:

                【解决方案11】:

                假设您正在分析美国在奥运会上的表现。您想从多个表中的多天/数年的田径赛事中堆叠 (UNION) 奖牌(银、金)。您不想在国家代码列上使用 UNION,因为它会忽略有价值的信息。会有很多观察结果有美国和“黄金”,但每一个都是自己的观察结果。

                【讨论】:

                  【解决方案12】:

                  为什么是UnionUnion all

                  回答: 如果您正在从两个或多个不同的表(我的意思是通过关系)查找一些数据,那么您可以使用它。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-07-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多