[SQL 2000]如何取得已知資料集合 特定筆數

  • 19312
  • 0
  • 2009-07-24

[SQL 2000]如何取得已知資料集合 特定筆數

今天遇到一個需求,主要是已知某個資料集合,可能有100筆,而我每次只要取其中5筆,例如1~5或12~16之類的,

有點slide window的味道,可能一次要取的是10筆,但是資料集合都是固定那一些,只是起始的row_number,也就是資料index不一樣。

 

希望直接用SQL statement取到自己想要的資料集合,

其實在ASP.NET的CODE有一堆資料結構可以用,倒是還蠻簡單的,

只是想順便訓練一下自己SQL的能力 (實在是太薄弱了…)

 

腦袋中有幾個想法,

1. SQL 2000是沒有Row_Number()可以用的,所以我要自己做出來Row_Number的效果,再用該欄去當條件,where過濾掉。

程式碼長這樣:

             (SELECT COUNT(*)
             FROM Table_A AS em2
             WHERE em2.Column_A < em1.Column_A) as temprownum
FROM Table_A AS em1

 

 

 

 

 

結果是長這樣:

rownumber

 

可是問題來了,這邊是不能直接下Where temprownum between 2 and 6的,會出現「無效的資料行名稱 ‘temprownum ’」

 

 

 

 

這時候的直覺,似乎就是只能用temp table或子查詢做了…詢問了一下幾位前輩的意見,看來最直覺的作法還是子查詢的方式

 

還有一些可能的特別作法,例如:

  1. top6 where not top1,取大範圍資料,再去除前面不要的資料。
  2. 正序top6,6筆再倒序top5,在正序回來,就是2~6筆。

這些作法都讓人覺得蠻有趣的,突然想到另外一個作法是join,只是不知道join會不會影響效能,

下面就解釋一下我的作法…

我的SQL是這樣:

join(SELECT role_id,
             (SELECT COUNT(*)
             FROM Table_A AS em2
             WHERE em2.role_id < em1.role_id) as temprownum
FROM Table_A AS em1) as b
on a.role_id=b.role_id
where b.temprownum between 1 and 5

 

 

 

 

 

結果如下:

result

只是不知道效能會不會比子查詢或temp table或not 條件子查詢 差…

這邊感謝強大的噗友群給的指導跟意見(謝謝 小朱大、Bibby、jeff_yeh、kenny hsu、坎尼、Bill叔跟安哥…感激不盡)

 

[補充]子查詢的作法

select * from
(SELECT role_id,
             (SELECT COUNT(*)
             FROM Table_A AS em2
             WHERE em2.role_id < em1.role_id) as temprownum
FROM Table_A AS em1) as subtable
where temprownum between 1 and 5

[補充2]SQL2005的作法

WITH tt AS
(
    SELECT
    ROW_NUMBER() OVER (ORDER BY ROLE_ID ) AS TEMPROWNUM,ROLE_ID
    FROM TABLE_A    
)
SELECT *  FROM tt
WHERE tt.TEMPROWNUM BETWEEN 1 AND 5

blog 與課程更新內容,請前往新站位置:http://tdd.best/