茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671887 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_0107.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

DB研討會 : [轉貼]SQL分頁select

發表者 討論內容
冷日
(冷日)
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
前一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|