Oracle 中distinct 和order by 同時使用,可能出現的問題
阿新 • • 發佈:2019-02-16
事例在Oracle資料庫中執行SQL:
select distinct name
from tableName
order by id
原本想過濾name欄位重複值,並按照id進行排序,但是SQL報錯,無法執行。
原因:SELECT語句中含有DISTINCT關鍵字或者有運算子時,排序用的欄位必須與SELECT語句中出現的欄位相對應。
網上搜到解釋如下:
在 ordere by 中指定多個列,結果將先按照子句中的第一列排序,然後第二個,依此類推。
在 select 中未出現的列名也可用於 ordere by 子句中,只要 table 中有就行。
但如果 select 子句中出現了 distinct 關鍵字,則只能用出現過的列名
如果想按照id排序,而又使name不重複,可用以下sql語句:
SELECT distinct name, min(id) as b FROM tableName group by name order by b;
其中的原理(要知其然且知其所以然):
加了distinct後,distinct欄位自帶排序功能,會先按照distinct後面的欄位進行排序。
order by可以改變distinct自帶的排序,從而達到你想要的排序效果,而不是distinct的排序效果。
distinct是怎麼排序的,以及它是怎麼去重複的,可以看sql的執行計劃順序。
綜上,其實就是一個執行先後順序
當然,上面已經說了,只有sqlserver和Oracle資料庫會有這個問題,mysql就沒有這個問題,這個和它們各自設計時的理解不同。