Oracle

Oracle union 預設排序很奇怪

  • May 27, 2016

如您所知,union刪除重複的行。我認為它會從後者中刪除,但事實並非如此。

我發現如果沒有order by子句,Oracle 會按第一列對合併的數據集進行排序並刪除重複項。

select 4,5,6 from dual
union 
select 1,2,3 from dual
union 
select 4,5,6 from dual

結果:

1   2   3
4   5   6

而我期望:

4   5   6
1   2   3

我失敗了很多次,就像上面的例子一樣讓問題變得簡單。

如何在沒有 的情況下保持聯合序列order by

在我的真實案例中,第一個select是完全匹配(=)結果,第二個是部分匹配(like)結果。

例如,如果我搜尋羅馬

完全匹配結果:roma,部分匹配結果:aroma

當然,完整的比賽結果應該是第一位的。正如我所說,這似乎order by是結果的第一列union

但是,如您所見:

select 'roma' from dual -- result comes out anyway..
union select 'aroma' from dual;

結果:

aroma
roma

香氣按字母順序排在羅馬之前,它排在第一位。

也許我應該嘗試union all刪除重複項?

正如已經不止一次提到的那樣,如果不使用 ORDER BY 子句顯式指定該順序,就不能期望行按特定順序排列。

對於您的問題中描述的問題,您實際上根本不需要 UNION。僅使用 LIKE 條件來覆蓋全部和部分匹配:

WHERE
 name LIKE '%roma%'

然後使用條件表達式根據匹配是完全匹配還是部分匹配對行進行排名,使用 DECODE 函式,例如:

ORDER BY
 DECODE(name, 'roma', 1, 2) ASC

或 CASE 表達式,對於另一個:

ORDER BY
 CASE name WHEN 'roma' THEN 1 ELSE 2 END ASC

引用自:https://dba.stackexchange.com/questions/139480