2011-08-21 11 views

答えて

10

あなたがOVER句やランキング機能を使用することができます。これを直接フィルタリングすることはできませんので、サブクエリまたは共通テーブル式が必要です。以下の例では、後者を使用しています。

DECLARE @MyTable TABLE 
(
    ID INT, 
    Name VARCHAR(15) 
) 
INSERT INTO @MyTable VALUES (1, 'Alice') 
INSERT INTO @MyTable VALUES (2, 'Bob') 
INSERT INTO @MyTable VALUES (3, 'Chris') 
INSERT INTO @MyTable VALUES (4, 'David') 
INSERT INTO @MyTable VALUES (5, 'Edgar') 

;WITH people AS 
(
    SELECT ID, Name, ROW_NUMBER() OVER (ORDER BY ID) RN 
    FROM @MyTable 
) 
SELECT ID, Name 
FROM people 
WHERE RN > 1 

OFFSETFETCHキーワードとSQ​​L Serverの(コードネームデナリ)の次のバージョンでページネーションのためのより良いサポートがあります。

+0

素晴らしい...私はこの方向には考えなかった。私はトップ5を選択しようとしていましたが、私は「スキップ」という単語を最初にスキップしようとしていました...ありがとうございました:-) –

+1

+1これはランク付け関数です。もっと便利な答え – Sascha

+0

+1は 'OFFSET'と' FETCH'情報です。 – dotNETbeginner

5

あなたはこのような何かを行うことができます:

SELECT 
    * 
FROM (
     SELECT  
      row_number() OVER (ORDER BY ID DESC) AS [rownum], 
      * 
     FROM 
      tbl 
) T 
WHERE 
    rownum BETWEEN (2) AND (5) 

更新:自分の価値観を持つように

を更新しました。

アップデート2:

が不足しているサブクエリでエラーを修正しました。クリスダイバーがこれを指摘してくれてありがとう。このような

+0

ありがとうございます。あなたの解決策もあります:-) –

+3

サブクエリなしでフィルタリングすることはできません。これは機能しません。 –

+0

私のエラー – Sascha

2

何か:

-- Test table 
declare @T table(ID int) 

-- Add test data 
insert into @T 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 

-- Query using row_number() over(...) 
-- to get rows 2 - 5 
select T.ID 
from (
     select *, 
       row_number() over(order by ID) as rn 
     from @T  
    ) as T 
where T.rn between 2 and 5 
関連する問題