1. 程式人生 > >如果指定了 SELECT DISTINCT,那麼 ORDER BY 子句中的項就必須出現在選擇列表中。(sqlserver中)

如果指定了 SELECT DISTINCT,那麼 ORDER BY 子句中的項就必須出現在選擇列表中。(sqlserver中)

1:sqlserver中如果用order by,同時用了distinct的話,order by後面的欄位就必須出現在selcet的欄位中。

select distinct FullName from users order by Id

上述 SQL 語句是不對的,會提示錯誤:

80040e14 如果指定了 SELECT DISTINCT,那麼 ORDER BY 子句中的項就必須出現在選擇列表中。

應該為:

select distinct Id, FullName from users order by Id

2:那麼如果我們不加distinct呢?

如果不加distinct,那麼select 

distinct FullName from users order by Id就是正確的。

3:這個問題經過測試,只有在sqlserver中才會有,mysql中是不會有這個問題的。

4:下面我們來看看原理啊,為什麼會出現上面的情況呢?

加了distinct後,distinct欄位自帶排序功能,會先按照distinct後面的欄位進行排序。

order by可以改變distinct自帶的排序,從而達到你想要的排序效果,而不是distinct的排序效果。

distinct是怎麼排序的,以及它是怎麼去重複的,可以看sql的執行計劃。

5:綜上,其實就是一個執行先後順序問題,沒有distinct關鍵字的時候,order by關鍵字先執行,select 關鍵字後執行,有了distinct,selcet distinct關鍵字先執行,order by後執行,如果select distinct執行完後,欄位都沒有了,那麼order by怎麼排序呢?

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