2011-02-17 101 views
0

有人能向我解釋爲什麼該SQL語句:SQL UNION問題

SELECT 'TEST1' 
UNION SELECT 'TEST2' 
UNION SELECT 'TEST3' 

回報:

TEST2 
TEST3 
TEST1 

我試圖找出這方面的UNION關鍵詞背後的邏輯。 有沒有辦法,我能得到它返回:不使用ORDER BY條款

TEST1 
TEST2 
TEST3 

?換句話說,我可以控制UNION語句的執行順序嗎?

如果它的事項,我使用Postgre 9.0和PHP作爲我的語言

非常感謝, 佈雷特

+1

僅供參考 - MS SQL 08返回1,2,3,我所期待。 – asawyer 2011-02-17 19:30:25

+0

瘋狂的猜測,嘗試`聯合所有`` – 2011-02-17 19:31:15

回答

6

按照PostgreSQL docs for UNION

UNION有效地追加QUERY2到QUERY1結果的結果(雖然沒有保證,這是其中的行實際上是返回順序)。

2

大多數數據庫並不能保證任何東西的順序沒有order by聲明。

聯合在大多數情況下可能允許數據庫並行操作所有3個查詢並儘可能快地返回行。

4

UNION語義是重複被刪除。 PostgreSQL使用Hash函數來刪除重複項,結果按鍵的哈希順序排序。

您可以使用UNION ALL,但SQL仍然不保證訂單,除非您使用ORDER BY子句。

EXPLAIN 
SELECT 'TEST1' 
UNION SELECT 'TEST2' 
UNION SELECT 'TEST3' 

產地:

HashAggregate (cost=0.07..0.10 rows=3 width=0) 
    -> Append (cost=0.00..0.06 rows=3 width=0) 
     -> Subquery Scan on "*SELECT* 1" (cost=0.00..0.02 rows=1 width=0) 
       -> Result (cost=0.00..0.01 rows=1 width=0) 
     -> Subquery Scan on "*SELECT* 2" (cost=0.00..0.02 rows=1 width=0) 
       -> Result (cost=0.00..0.01 rows=1 width=0) 
     -> Subquery Scan on "*SELECT* 3" (cost=0.00..0.02 rows=1 width=0) 
       -> Result (cost=0.00..0.01 rows=1 width=0) 

EXPLAIN 
SELECT 'TEST1' 
UNION ALL SELECT 'TEST2' 
UNION ALL SELECT 'TEST3' 

產地:

Append (cost=0.00..0.06 rows=3 width=0) 
    -> Subquery Scan on "*SELECT* 1" (cost=0.00..0.02 rows=1 width=0) 
     -> Result (cost=0.00..0.01 rows=1 width=0) 
    -> Subquery Scan on "*SELECT* 2" (cost=0.00..0.02 rows=1 width=0) 
     -> Result (cost=0.00..0.01 rows=1 width=0) 
    -> Subquery Scan on "*SELECT* 3" (cost=0.00..0.02 rows=1 width=0) 
     -> Result (cost=0.00..0.01 rows=1 width=0)