DISTINCT 無法排序的繞路方法
前陣子在努力處理郵遞區號時想要改進一下UI的顯示
把區照著郵遞區號去排序,像是
這種效果,其實T-SQL很簡單
SELECT DISTINCT ZIP3A, CITY, AREA
FROM RALL
ORDER BY ZIP3A
不過事情總是沒有想的那麼順利,本來的程式沒有取得ZIP3A這個欄位
如果要加上去會非常非常的麻煩,所以要不就是要經過DataAdapter
要不就是從SQL下手
能省DataAdapter是最好所以就先從T-SQL下手了
試了半天只要經過DISTINCT排序就會不見
不管是不是先用子查詢先排好了或是塞到temp table都一樣
所以用了同事的方法,自己排好再用ROW_NUMBER去篩選取第一筆吧
SELECT CITY, AREA, ZIP3A
FROM (
SELECT ROW_NUMBER() OVER( PARTITION BY AREA ORDER BY ZIP3A ) AS 'RNO' , CITY, AREA ,ZIP3A
FROM RALL
) AS AreaTable
WHERE RNO = 1
ORDER BY ZIP3A
這樣的結果是
跟想要的結果一模一樣而且可以不選擇ZIP3A這個欄位
SELECT CITY, AREA
FROM (
SELECT ROW_NUMBER() OVER( PARTITION BY AREA ORDER BY ZIP3A ) AS 'RNO' , CITY, AREA ,ZIP3A
FROM RALL
) AS AreaTable
WHERE RNO = 1
ORDER BY ZIP3A
結果就是既符合現行的Schema,又是經過我們想要的條件排序的結果
代價就是查詢的cost會比較高
下面的圖,第一個計劃是自己排序的方法,第二個計畫是不排序的原方法,第三個是加上ZIP3A欄位排序的方法
比起不排的是足足多了兩倍有找,但是比起加上一個欄位再去排差距其實也還好