的一個部分,我有一個聯合查詢,我想只是一個聯盟的一部分進行排序爲了通過聯合查詢
Query1
UNION
Query2
UNION
Query3
所以,我只想排序查詢2,第三列。所有3個查詢都有3列。
這可能嗎?
的一個部分,我有一個聯合查詢,我想只是一個聯盟的一部分進行排序爲了通過聯合查詢
Query1
UNION
Query2
UNION
Query3
所以,我只想排序查詢2,第三列。所有3個查詢都有3列。
這可能嗎?
「這可能嗎?」
編號UNION是一個集合運算符,因此它會將每個查詢的結果集嵌入不同記錄的新結果集中。 查詢2的輸出將不再可識別。
例外情況是,如果每個子查詢自己生成一組唯一的記錄,則應使用UNION ALL,該過程不會篩選重複項。儘管這引出了一個哲學觀點:將結果集的一部分進行排序而其餘未排序是什麼意思?從字面上看,這將是什麼樣子?
'UNION是一個集合運算符,因此它會將每個查詢的結果集嵌入不同記錄的新結果集中......這意味着(至少對我來說)所有集合運算符都會做同樣的事情,除了'UNION ALL'是一個集合運算符,但它並不區分記錄(並且,順便說一句,將允許其中一個查詢的記錄被命令和其餘無序)。也許是語義學,但是'UNION是一個集合運算符,這個集合運算符'使得它更清晰,恕我直言。 – Boneist
在數學中,一個集合是一組不同的對象,所以可以認爲'union all'不是一個集合運算符:)但是然後RDBMSs經常與集合理論一起玩fast'n'loose – APC
在所有計數中都是真的! * {;-) – Boneist
在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
這工作。謝謝。 – user1936588
@ user1936588它可能已經工作,但它仍然絕對沒有意義做到這一點,恕我直言。要麼甲骨文足夠聰明地忽略命令,否則你將迫使甲骨文做一個額外的,不必要的步驟。即使你的結果集彼此是唯一的(即一組特定的值只能出現在其中一個查詢中),你仍然不能保證輸出將保持你想要的順序。 – Boneist
如果這沒有意義,他的問題是沒有道理的,情況可能如此。我剛剛回答了這個問題。 –
不,事實並非如此。是的。你必須用同樣的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訂購結果的方式。
請在sort2中排序並用括號包裝query2嗎? – Blank
我試過並得到錯誤「缺少右括號」 – user1936588
「(Query2)」是否給你「缺少右括號」? – Blank