2013-01-17 36 views
2

聯合所有查詢的兩部分順序是否按特定順序給出?即這個查詢的結果:聯盟的順序是否全部都有保證

select 'foo' from dual 
union all 
select 'bar' from dual 

永遠是

foo 
bar 

,而不是這個

bar 
foo 

我使用了Oracle語法,但是我想知道的是ISO標準對此有何說法。

+2

「在SQL世界,秩序是不是一組數據的固有屬性。因此,你不能保證......你的數據會回來按照一定的順序 - 甚至在一個一致的順序 - 除非您使用ORDER BY子句查詢數據。「 – showdev

+0

我不知道訂單是否有保證(它不應該是),但你可以手動附上這些查詢到另外一個,然後命令結果'SELECT * FROM(SELECT「富」 AS COL_1 ... UNION。 ..)ORDER BY col_1'。至少這樣的查詢將是冗長和明確的。 – Crozin

回答

3

在您的具體示例中,訂單不應該因爲您要查詢DUAL表而發生變化,您不必擔心來自該特定查詢的潛在索引更改。所以你總是會分別獲得Foo和Bar。

然而,在現實世界中,是的,爲了能最肯定會發生變化 - 取決於幾個因素,如表中的索引,要返回的列,引入新的數據,等等。所以,如果你想你的結果在一個有序特別的方法,你需要指定ORDER BY子句。

希望這會有所幫助。

1

查詢的建議重寫:

SELECT txt FROM (
select 1 as sort, 'foo' as txt from dual 
union all 
select 2 as sort, 'bar' as txt from dual 
) product 
ORDER BY sort 
+0

謝謝,這很簡單。我想知道是否需要這樣的重寫。 –

+0

正如其他人所說,你可能會被罰款,但它並非沒有指定保證。 – invertedSpear

1

ISO標準說,表格本身是無序的。它還表示,當您從查詢中返回行時,除非使用order by子句,否則有保證排序。

練習,在這種情況下,大多數數據庫將在條之前返回foo。但是,如果將union all更改爲union,某些數據庫可能會首先返回該欄。

更糟的是,你甚至不能說第一個查詢中的所有行都會在第二個查詢之前返回。例如,在一個並行環境中,來自聯合的結果集可以將所有兩個表混合在一起。

如果您想要先使用foo,請添加order by txt desc或其他內容。