DISTINCT 無法排序的繞路方法

  • 6137
  • 0
  • 2011-02-25

DISTINCT 無法排序的繞路方法

前陣子在努力處理郵遞區號時想要改進一下UI的顯示

把區照著郵遞區號去排序,像是

image

這種效果,其實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

這樣的結果是

image

跟想要的結果一模一樣而且可以不選擇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

 

image

結果就是既符合現行的Schema,又是經過我們想要的條件排序的結果

代價就是查詢的cost會比較高

下面的圖,第一個計劃是自己排序的方法,第二個計畫是不排序的原方法,第三個是加上ZIP3A欄位排序的方法

 

image

比起不排的是足足多了兩倍有找,但是比起加上一個欄位再去排差距其實也還好