遇到一個需求,要去重查出某張表的字段一和字段二,但是查出來的結果要按照表中記錄的創建時間排序。
於是,第一時間就想到了使用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在去重同時有數據庫自己的一套排序規則,也就是說去重回伴隨重新排序,並且排序規則對開發人員不可見。
總結,想按照去重后篩選字段之外的字段進行排序,無解。
