1. 程式人生 > >如果指定了 SELECT DISTINCT,那麼 ORDER BY 子句中的項就必須出現在選擇列表中。(解決方法及原因分析)

如果指定了 SELECT DISTINCT,那麼 ORDER BY 子句中的項就必須出現在選擇列表中。(解決方法及原因分析)

解決辦法:sqlserver中如果同時用order by和distinct,那order by後面的欄位就必須出現在selcet的欄位中。這個問題只有在sqlserver中才會有,mysql中是不會有這個問題的。


如果這樣寫會提示錯誤:
select distinct name from user order by id

應該這樣寫:
select distinct id,name from user order by id


為什麼會出現這種情況?我們來看下原因:
distinct自帶排序功能,會先按照distinct後面的欄位進行排序,而order by是可以改變distinct自帶的排序,所以原因其實就是一個執行先後順序問題,沒有distinct時,order by先執行,select後執行,有了distinct,selcet distinct先執行,order by後執行,如果select distinct執行完後,去除了相應欄位,所以order by就沒法排序了。


如果你不明白distinct是怎麼排序和去重複的,去看下SQL的執行計劃就明白了。