1. 程式人生 > >Oracle 中distinct 和order by 同時使用,可能出現的問題

Oracle 中distinct 和order by 同時使用,可能出現的問題

事例在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的執行計劃順序

綜上,其實就是一個執行先後順序

問題,沒有distinct關鍵字的時候,order by關鍵字先執行,select 關鍵字後執行,有了distinct,selcet distinct關鍵字先執行,order by後執行,如果select distinct執行完後,欄位都沒有了,那麼order by怎麼排序呢?

當然,上面已經說了,只有sqlserver和Oracle資料庫會有這個問題,mysql就沒有這個問題,這個和它們各自設計時的理解不同。