2010-10-11 137 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,則不會消除重複值。 :)