SQL去重之distinct和group by的應用


  遇到一個需求,要去重查出某張表的字段一和字段二,但是查出來的結果要按照表中記錄的創建時間排序。

  於是,第一時間就想到了使用distinct這個去重專用語法了:

1 select distinct col1, col2 from table1 order by create_date;

  嗯,自我感覺良好,一運行,拋出了異常,因為select選出的結果中根本沒有create_date這個字段,還用這個字段排序,那不就報錯了嗎,於是改為:

1 select distinct col1, col2, create_date from table1 order by create_date;

  嗯,可以了,不報錯了,但是查詢出來的結果不符合要求!為什么?因為distinct是全字段去重查詢的,也就是說在distinct后面加上create_date會時查詢語句按照col1、col2、create_date這三個字段去重,只要有一個字段不同,就認為整條記錄不同,而需求是篩選出col1、和col2不同的記錄。

  然后試一下使用group by這個語法進行去重,結果也是報錯。

1 select col1, col2, create_date from table1 group by col1, col2 order by create_date

  看來只能使用嵌套查詢了,里層使用order by排序,再將結果集按照distinct進行篩選。

1 select distinct t.col1, t.col2 from 
2 ( 3     select col1, col2, create_date 4     from table1 5    order by create_date 6 ) t

  結果,失敗了,里層排序后在層再進行去重時排序被打亂,原來distinct在去重同時有數據庫自己的一套排序規則,也就是說去重回伴隨重新排序,並且排序規則對開發人員不可見。

  總結,想按照去重后篩選字段之外的字段進行排序,無解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM