【SQLServer】N件目からM件目のレコードを取得する

SQLServer2005以降で、ROW_NUMBER を使ってみる

SELECT 
    * 
FROM 
    (
    SELECT 
        ROW_NUMBER() OVER(ORDER BY OrderID, ProductID) AS ROWNUM, 
        * 
    FROM 
        "Order Details Extended" 
    ) A 
WHERE 
    ROWNUM BETWEEN 11 AND 20 
ORDER BY 
    OrderID, 
    ProductID
;

SQLは簡潔明瞭ですが、サブクエリで全件返しているので、効率が良くないかもしれません。


TOP を組み合わせてみる

SELECT TOP 10 
    * 
FROM 
    "Order Details Extended" A 
WHERE 
    NOT EXISTS (
    SELECT 
        * 
    FROM 
        (
        SELECT TOP 10
            * 
        FROM 
            "Order Details Extended" 
        ) B 
    WHERE 
        A.OrderID = B.OrderID 
        AND A.ProductID = B.ProductID
    ) 
ORDER BY 
    OrderID, 
    ProductID
;

NOT EXISTSを使っているので、少し分かりにくいかと思いますが、要約すると、
先頭10件を除いた集合の中から、さらに先頭の10件を返す
ということになります。

投稿者: ♪ 日時: 2008年03月15日 00:02 このエントリーをはてなブックマークに追加 このエントリーをYahoo!ブックマークに登録 Save This Page to del.icio.us このエントリーをlivedoorクリップに追加 このエントリーをニフティクリップに追加 このエントリーをBuzzurlに追加このエントリーをBuzzurlに追加 このエントリーをBlogPeople Tagsに追加 このエントリーをBlogPeople Instant Bookmarkに追加 このエントリーをPingKingポッケに追加 このエントリーをFC2ブックマークへ追加 このエントリーをnewsingへ追加 Yahoo!ブックマークでこのサイトを登録している人数 人が登録

トラックバック

このエントリーのトラックバックURL:
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/562

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)