2017-06-29 81 views
0

的一個部分,我有一個聯合查詢,我想只是一個聯盟的一部分進行排序爲了通過聯合查詢

Query1 
UNION 
Query2 
UNION 
Query3 

所以,我只想排序查詢2,第三列。所有3個查詢都有3列。

這可能嗎?

+0

請在sort2中排序並用括號包裝query2嗎? – Blank

+0

我試過並得到錯誤「缺少右括號」 – user1936588

+0

「(Query2)」是否給你「缺少右括號」? – Blank

回答

3

「這可能嗎?」

編號UNION是一個集合運算符,因此它會將每個查詢的結果集嵌入不同記錄的新結果集中。 查詢2的輸出將不再可識別。

例外情況是,如果每個子查詢自己生成一組唯一的記錄,則應使用UNION ALL,該過程不會篩選重複項。儘管這引出了一個哲學觀點:將結果集的一部分進行排序而其餘未排序是什麼意思?從字面上看,這將是什麼樣子?

+0

'UNION是一個集合運算符,因此它會將每個查詢的結果集嵌入不同記錄的新結果集中......這意味着(至少對我來說)所有集合運算符都會做同樣的事情,除了'UNION ALL'是一個集合運算符,但它並不區分記錄(並且,順便說一句,將允許其中一個查詢的記錄被命令和其餘無序)。也許是語義學,但是'UNION是一個集合運算符,這個集合運算符'使得它更清晰,恕我直言。 – Boneist

+0

在數學中,一個集合是一組不同的對象,所以可以認爲'union all'不是一個集合運算符:)但是然後RDBMSs經常與集合理論一起玩fast'n'loose – APC

+0

在所有計數中都是真的! * {;-) – Boneist

1

在Oracle中不可能對ORDER BY進行UNIONed嵌套查詢。詳情請參閱APC的解釋。

您可以使用subquery factoring克服這個

WITH T2SORTED 
AS 
(SELECT id FROM T2 ORDER BY id) 
SELECT id FROM T1 
UNION 
SELECT id FROM T2SORTED 
UNION 
SELECT id FROM T3 

SQLfiddle

+0

這工作。謝謝。 – user1936588

+1

@ user1936588它可能已經工作,但它仍然絕對沒有意義做到這一點,恕我直言。要麼甲骨文足夠聰明地忽略命令,否則你將迫使甲骨文做一個額外的,不必要的步驟。即使你的結果集彼此是唯一的(即一組特定的值只能出現在其中一個查詢中),你仍然不能保證輸出將保持你想要的順序。 – Boneist

+0

如果這沒有意義,他的問題是沒有道理的,情況可能如此。我剛剛回答了這個問題。 –

0

不,事實並非如此。是的。你必須用同樣的order by排序整個工會,但是沒有什麼能阻止你在整個工會中添加一兩列。

所以我們假設我們有表foo,bar和baz。每個都有列A,B和C.讓我們用B作爲你想要分類的那個。我們會通過bar和baz來訂購B。我們還會迫使A的所有結果出現在B的所有結果之前,並將它們放在C之前。我們必須這樣做,以確保B的結果是有序的。

select a.foo 
, a.bar 
, a.baz 
, 0 as primary_sort 
, 0 as secondary_sort 
from A 
union 
select b.foo 
, b.bar 
, b.baz 
, 1 as primary_sort 
, row_number() over (order by b.bar, b.baz) as secondary_sort 
from B 
union 
select c.foo 
, c.bar 
, c.baz 
, 2 as primary_sort 
, 0 as secondary_sort 
from C 
order by primary_sort, secondary_sort; 

然後,如果你不希望傳遞下去的排序列,你可以用一個select語句周圍:

select foo, bar, baz from (
-- query from above WITHOUT the order by 
) order by primary_sort, secondary_sort; 

的關鍵是primary_sort必須在每個查詢同一類型secondary_sort也是如此。 row_number()函數可讓您根據需要添加任意數量的列,並將其減少爲單個數字。所以over (order by ...)就是實際聲明你想要從B訂購結果的方式。