2010-10-11 141 views
3

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

+0

谢谢,你所有的答案说,只有两个要点1.)重复行和2)。性能。这意味着我们可以使用其中的任何一个,所以我不明白为什么我们不能在这个查询中使用union。 与TempData的作为 ( 选择32 COL1,CHAR(32)如COL2 UNION ALL 选择COL1 + 1,焦炭(从TempData的COL1 + 1)其中,COL1 <127 ) SELECT * FROM的TempData – 2010-10-11 07:28:14

+0

@Jeevan Bhatt - 当您在查询中使用'UNION'而不是'UNION ALL'会发生什么?你在用什么数据库? – 2010-10-11 11:01:54

+0

@Jeevan Bhatt - 查看了一下你的查询我相信有一些语法错误会阻止它执行。 CTE中的第一个子查询缺少一个FROM子句,而第二个子查询是指CTE内的CTE,这是不允许的。你想要完成什么? – 2010-10-11 11:06:10

回答

14

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

+1

+1用于指定UNION ALL的可能场景 – Christian 2010-10-11 07:02:52

+3

+1用于提及性能 - 这几乎是至关重要的,需要了解UNION与UNION ALL对于更大表的影响,其中UNION的执行速度将比UNION ALL慢几个数量级对于大的结果集(因为在大多数情况下删除重复意味着建立临时索引;对于较小的结果集,这不会太昂贵,结果集的大小是返回的行数*) – Unreason 2010-10-11 07:10:11

+1

我会说“可以容忍”多个副本反对“需要”。例如,当你说'WHERE ForeignKey IN(SELECT ID FROM view1 UNION ALL SELECT ID FROM view2)'。你不需要两者兼顾,但是你可以放心使用 – 2012-06-22 18:33:54

1

当我们不需要从记录排除重复的行

7
  • 联盟将删除重复
  • 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 
+1

如果您正在进行大量JOIN并且有冗余行,您会使用GROUP BY而不是UNION吗? UNION和DISTINCT有什么区别? – 2010-10-11 07:05:58

+0

@meder:GROUP BY删除重复项是滥用:它是为了聚合。 DISTINCT是每个SELECT。也就是说,我可以有SELECT DISTINCT .. UNION ALL SELECT ...如果需要的话。这意味着去除重复的第一个子句,但是取出UNION上的所有行。 – gbn 2010-10-11 07:25:58

3

当你需要使用它们时以您的要求结束。 UNION和UNION ALL之间的区别在于UNION ALL不删除重复的行。

2

Union all用于连接多个数据集到一个单一的数据集,但它不会删除重复

1

您使用UNION ALL来连接(追加)两个结果集到一个单一的结果集,当他们有相同的列(数量和类型)。

4

一个例子可以更清晰:

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

-1

为什么UnionUnion all

Ans: 如果您正在查看来自两个或更多不同表格(我的意思是关系)的一些数据,那么您可以使用它。

1

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

相同的逻辑适用于SELECT DISTINCTSELECT ALL之间的选择,BTW。

0

默认情况下,UNION将消除重复值。如果用UNIONALL替换UNION,则不会消除重复值。 :)