|
|
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已! |
|
恭喜您是本站第 1729248
位訪客!
登入 | 註冊
|
|
|
|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2010/6/24 17:22 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]SQL分頁select
- SQL分頁select
分頁前SQL
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [ASC/DESC]MS-SQL
MS-SQL Type A 無排序,在關聯式查詢時,可能導致每次查詢同一分頁的資料時,出來的資料都不一樣。
SELECT [欄位1, 欄位2, ...] FROM [資料表]
WHERE [主要索引欄位] IN
(
SELECT * FROM
(
SELECT TOP [每頁長度*第幾頁] [主要索引欄位]
FROM [資料表]
WHERE [篩選條件]
)
AS [資料表别名1]
WHERE [主要索引欄位] NOT IN
(
SELECT TOP [每頁長度] [主要索引欄位]
FROM [資料表]
WHERE [篩選條件]
)
)
MS-SQL Type B 有排序,又稱【夾擠式分頁查詢】。MS-SQL 2000以前,常見的分頁用語法。
SELECT * FROM
(
SELECT TOP [每頁長度] * FROM
(
SELECT TOP [每頁長度*第幾頁] [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [DESC/ASC]
)
AS [資料表别名1]
ORDER BY [排序欄位] [ASC/DESC]
)
AS [資料表别名2]
ORDER BY [排序欄位] [DESC/ASC]
MS-SQL Type C MS-SQL 2005以後才有RANK()語法。
SELECT * FROM
(
SELECT rank() OVER ( ORDER BY [排序欄位] [ASC/DESC] ) AS RankNumber, * FROM
(
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
)
AS [資料表别名1]
) AS [資料表别名2]
WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁]
MS-SQL Type D MS-SQL 2000可用,但Select時,不可包含PK用的欄位。(需透過暫存資料表操作) 參考資料:(SQL)抽獎,亂數抽出10筆中獎資料並排名
SELECT IDENTITY(INT,1,1) AS RankNumber, [欄位1, 欄位2, ...]
INTO [#暫存資料表名稱]
FROM [資料表]
ORDER BY [排序欄位] [ASC/DESC];
SELECT * FROM [#暫存資料表名稱]
WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁];
DROP TABLE [#暫存資料表名稱];
其他相關 當DataGrid遇見100萬筆資料 (以SQL預存程序實作SQL-Sever的北風資料庫的分頁範例) SQL Server 2000 Paging and Sorting Using ROWCOUNT and SQL_VARIANT MySQL
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [ASC/DESC]
LIMIT [每頁長度] OFFSET [每頁長度*第幾頁]
Oracle 使用ROWNUM做分頁
SELECT * FROM (
SELECT [欄位1, 欄位2, ...]
FROM [資料表]
WHERE [篩選條件]
ORDER BY [排序欄位] [ASC/DESC]
)
WHERE ROWNUM >= [每頁長度*(第幾頁-1)+1]
AND ROWNUM <= [每頁長度*第幾頁]
參照:On Top-n and Pagination Queries
原文出處:SQL - ProgWiki
|
|
|
討論串
|