DISTINCT
實際上過濾結果集中,與SELECT子句中給定的任何表達式唯一內容。
我們不能使用不同的表達式或列名進行排序。請看這裏的例子。
SQL> l
1 SELECT DISTINCT (col1),(col2)
2 FROM
3 (SELECT 'Hello' col1,'World' col2 FROM DUAL
4 UNION ALL
5 SELECT 'HELLO','WORLD' FROM DUAL
6* )
SQL>/
COL1 COL2
----- -----
HELLO WORLD
Hello World
你可以看到,DISTINCT
是CASE SENSITIVE
在這裏。(2行顯示)
所以,讓我對兩列做一個UPPER()
。
SQL> l
1 SELECT DISTINCT UPPER (col1),UPPER(col2)
2 FROM
3 (SELECT 'Hello' col1,'World' col2 FROM DUAL
4 UNION ALL
5 SELECT 'HELLO','WORLD' FROM DUAL
6* )
SQL>/
UPPER UPPER
----- -----
HELLO WORLD
只有1行被顯示,忽略了大小寫。
回到實際問題。要在DISTINCT
結果集上訂購某些內容,它必須是DISTINCT
子句的表達式/列的一部分。
所以,當你發出DISTINCT COL1,COl2
,順序由可通過COL1
或COL2
/..它不能COL3
甚至UPPER(COL1)
因爲UPPER()使不同的表達發生衝突DISTINCT上的表達。
最後,回答您問題將
,如果你希望你的ORDER
是不區分大小寫,DISTINCT
也有同樣的方式!如下所示
SELECT DISTINCT
UPPER(asssss),
saas_acc
FROM DUAL
ORDER BY upper(asssss) ASC ;
或者如果必須使用UNION,最好做到這一點,或與上述相同。
SELECT * FROM
(
SELECT DISTINCT asssss as asssss,
saas_acc
FROM DUAL
UNION
SELECT '--ALL--','ALL' FROM DUAL
)
ORDER BY upper(asssss) ASC ;
從我自己的經驗的,我一直覺得,什麼都表達/列在ORDER BY
規定,它是採取最後SELECT
隱含爲好。排序只是基於實際結果中的列號(位置)。在這種情況下,DISTINCT COL1,COl2
已經在那裏。當你給ORDER BY UPPER(COL1)
時,它會試圖追加到SELECT
表達式中,這個表達式可能是NOT
。因此,語義檢查自己,將取消資格此查詢與錯誤!
您的查詢似乎沒有多大意義。 'UNION'已經做了'DISTINCT',所以兩者都沒有理由。您的最高查詢是選擇兩個不存在於'dual'中的列。 –