SELECT tname, tabtype FROM (
SELECT tname, tabtype, ROW_NUMBER() OVER (ORDER BY tname) rn FROM tab
) WHERE rn BETWEEN 100 AND 150;
SELECT tname, tabtype FROM (
SELECT tname, tabtype, ROWNUM rn FROM tab WHERE ROWNUM <= 150
) WHERE rn >= 100;
注意:ORDER BY 在外層才生效,內層 ROWNUM 依原順序編號。
建立測試表 mynumber(id, name),含重複 id:
SELECT id, name,
RANK() OVER (ORDER BY id) r1,
DENSE_RANK() OVER (ORDER BY id) r2,
ROW_NUMBER() OVER (ORDER BY id) r3
FROM mynumber;
WHERE r1 <= 10 (RANK)WHERE r2 <= 10 (DENSE_RANK)WHERE r3 <= 10 (ROW_NUMBER)CREATE TABLE mynumber(id INT, name VARCHAR(10));
INSERT INTO mynumber VALUES (1,'no1'), (2,'no2'), ...;
-- 標準 FETCH FIRST
SELECT * FROM mynumber FETCH FIRST 10 ROWS ONLY;
-- 配合分析函數
SELECT * FROM (
SELECT id, name,
RANK() OVER (ORDER BY id) r1,
DENSE_RANK() OVER (ORDER BY id) r2,
ROW_NUMBER() OVER (ORDER BY id) r3
FROM mynumber
) t WHERE r3 BETWEEN 5 AND 10;
WHERE id IN (SELECT DISTINCT id FROM mynumber FETCH FIRST 10 ROWS ONLY)WHERE r2 <= 10WHERE r3 <= 10SELECT id FROM mytable ORDER BY update_date DESC LIMIT 0, 10; -- 第 1-10 筆
SELECT id FROM mytable ORDER BY update_date DESC LIMIT 10, 10; -- 第 11-20 筆
| 資料庫 | 標準分頁 | 語意控制 | 備註 |
|---|---|---|---|
| Oracle | ROW_NUMBER() | RANK/DENSE_RANK/ROW_NUMBER | 需巢狀查詢 |
| DB2 | FETCH FIRST n ROWS ONLY | 同 Oracle 分析函數 | 標準 SQL:2003 |
| MySQL | LIMIT offset, rows | 僅 ROW_NUMBER 語意 | 最簡潔 |
OFFSET ... FETCH FIRST ... (DB2/PostgreSQL/Oracle 12c+)