聯合所有查詢的兩部分順序是否按特定順序給出?即這個查詢的結果:聯盟的順序是否全部都有保證
select 'foo' from dual
union all
select 'bar' from dual
永遠是
foo
bar
,而不是這個
bar
foo
?
我使用了Oracle語法,但是我想知道的是ISO標準對此有何說法。
聯合所有查詢的兩部分順序是否按特定順序給出?即這個查詢的結果:聯盟的順序是否全部都有保證
select 'foo' from dual
union all
select 'bar' from dual
永遠是
foo
bar
,而不是這個
bar
foo
?
我使用了Oracle語法,但是我想知道的是ISO標準對此有何說法。
在您的具體示例中,訂單不應該因爲您要查詢DUAL
表而發生變化,您不必擔心來自該特定查詢的潛在索引更改。所以你總是會分別獲得Foo和Bar。
然而,在現實世界中,是的,爲了能最肯定會發生變化 - 取決於幾個因素,如表中的索引,要返回的列,引入新的數據,等等。所以,如果你想你的結果在一個有序特別的方法,你需要指定ORDER BY
子句。
希望這會有所幫助。
查詢的建議重寫:
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
謝謝,這很簡單。我想知道是否需要這樣的重寫。 –
正如其他人所說,你可能會被罰款,但它並非沒有指定保證。 – invertedSpear
ISO標準說,表格本身是無序的。它還表示,當您從查詢中返回行時,除非使用order by
子句,否則有否保證排序。
在練習,在這種情況下,大多數數據庫將在條之前返回foo。但是,如果將union all
更改爲union
,某些數據庫可能會首先返回該欄。
更糟的是,你甚至不能說第一個查詢中的所有行都會在第二個查詢之前返回。例如,在一個並行環境中,來自聯合的結果集可以將所有兩個表混合在一起。
如果您想要先使用foo,請添加order by txt desc
或其他內容。
「在SQL世界,秩序是不是一組數據的固有屬性。因此,你不能保證......你的數據會回來按照一定的順序 - 甚至在一個一致的順序 - 除非您使用ORDER BY子句查詢數據。「 – showdev
我不知道訂單是否有保證(它不應該是),但你可以手動附上這些查詢到另外一個,然後命令結果'SELECT * FROM(SELECT「富」 AS COL_1 ... UNION。 ..)ORDER BY col_1'。至少這樣的查詢將是冗長和明確的。 – Crozin