[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
結果是長這樣:
可是問題來了,這邊是不能直接下Where temprownum between 2 and 6的,會出現「無效的資料行名稱 ‘temprownum ’」
這時候的直覺,似乎就是只能用temp table或子查詢做了…詢問了一下幾位前輩的意見,看來最直覺的作法還是子查詢的方式
還有一些可能的特別作法,例如:
- top6 where not top1,取大範圍資料,再去除前面不要的資料。
- 正序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
結果如下:
只是不知道效能會不會比子查詢或temp table或not 條件子查詢 差…
這邊感謝強大的噗友群給的指導跟意見(謝謝 小朱大、Bibby、jeff_yeh、kenny hsu、坎尼、Bill叔跟安哥…感激不盡)
[補充]子查詢的作法
(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的作法
(
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/