2012-01-26 11 views
4

SQL ServerのLIMIT句の代わりに多くのことを読んできました。彼らはまだそれを適応させることを拒むので、とてもイライラしています。とにかく、私は本当にこの周りに頭を浮かべることはできませんでした。私が変換しようとしているクエリはこれです...SQL ServerのMySQL LIMIT句と同等

SELECT ID, Name, Price, Image FROM Products ORDER BY ID ASC LIMIT $start_from, $items_on_page 

ご協力いただきありがとうございます。

+0

見た目は合法です。エラーは何ですか? –

+0

http://stackoverflow.com/questions/3128043/limit-results-on-sql-request – tim

+0

http://stackoverflow.com/questions/3128043/limit-results-on-sql-request – tim

答えて

25

SQL Server 2012では、ANSI標準OFFSET/FETCHの構文がサポートされています。 I blogged about thisここではthe official docです(これはORDER BYの拡張です)。 SQL Server 2012のために変換あなたの構文は次のようになります。

SELECT ID, Name, Price, Image 
    FROM Products 
    ORDER BY ID ASC 
    OFFSET (@start_from - 1) ROWS -- not sure if you need -1 
    -- because I don't know how you calculated @start_from 
    FETCH NEXT @items_on_page ROWS ONLY; 

その前に、あなたはROW_NUMBER()方法など、さまざまな回避策を使用する必要があります。 this articleおよびfollow-on discussionを参照してください。あなたは、SQL Server 2012の上にない場合は、標準の構文または使用することはできませんMySQLのLIMIT非標準しかし、あなたのような、より詳細なソリューションを使用することができます。この猫を肌にする、他の多くの方法があります

;WITH o AS 
(
    SELECT TOP ((@start_from - 1) + @items_on_page) 
     -- again, not sure if you need -1 because I 
     -- don't know how you calculated @start_from 
     RowNum = ROW_NUMBER() OVER (ORDER BY ID ASC) 
     /* , other columns */ 
    FROM Products 
) 
SELECT 
    RowNum 
    /* , other columns */ 
FROM 
    o 
WHERE 
    RowNum >= @start_from 
ORDER BY 
    RowNum; 

、これは最も効率的ではありそうにないが、シンタックスの方がおそらく最もシンプルです。私は、私が投稿したリンクだけでなく、質問にコメントに記載されている重複した提案を検討することをお勧めします。

+0

申し訳ありませんが、Mr.Anonは私でした。私は正解に投票したようです。私はあなたが言及した2番目の方法を使用し、魅力的な作品:) – Zizo47

-1

アプリケーションに状態を保存できるようにする場合は、TOP items_on_pageを使用してこれを行うことができます。あなたがしたのは、最後に検索したアイテムのIDを格納することです。その後のクエリごとにAND ID > [last ID]を追加します。だから、あなたは毎回オフにしたところから始めて、items_on_pageのバッチで商品を手に入れます。

+0

まあ、ベースこれは実際のデータでは間違いの可能性があります。この表の行を決して削除できない限り、データは常にシフトできます。また、データはIDで注文する必要があると想定していますが、これはあまり一般的ではありません。通常、データはアルファベット順、関連性、価格またはその他のユーザー定義の順序で並べられます。 –

+0

@AaronBertrand:彼は元のクエリのIDでソートし、それが割り当てられた識別子のように見えます。 – Borealid

+0

すべての読者が同じ要件を持つとはかぎりませんが、元の質問のニュアンスに気づくでしょう。 –

1

行カウント:最後の文の影響を受ける行の数を返します。あなたがドンすると、rowcontがリセットされます。

SELECT TOP $items_on_page ID, Name, Price, Image 
FROM (SELECT TOP $start_from + $items_on_page - 1 * FROM Products ORDER BY ID) as T 
ORDER BY ID DESC 

はEDIT:Explanation-

ありませんが、サブクエリを歩き回るが、これはあなたがTOPクエリ

SELECT TOP 100 * FROM Sometable ORDER BY somecolumn 
+0

これは最初のページにはうってつけです。 2番目、3番目、n番目のページを取得するのが少し複雑になる必要があります。また、2番目のページを要求して80個の行しかない場合は正常に失敗します。 –

2

これを試してみてくださいを使用して試すことができます

SET ROWCOUNT 100 

または エレガントなソリューション。 個のアイテムが1行あたり5の行から始まり、10の行が最上部の14行になるとします。本質的にLIMIT 5,10

+0

私はあなたのクエリをテストしましたが、これは返されました: キーワード 'FROM'の近くの構文が正しくありません – Zizo47

+0

どの行がそれを示していますか? – Jivings

+0

ああ、心配しないで、ちょうどそれを考え出した。あなたのコードは素晴らしいです、明らかに問題はアイテムの最後のページでいくつかを繰り返すかもしれません。ありがとうございます – Zizo47

4

SQL Server 2005および2008の場合 これは、LastNameで注文されたレポートテーブルから11〜20の行を選択するクエリ例です。

SELECT a.* FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY LastName) as row FROM Report) a 
WHERE a.row > 10 and a.row <= 20 
関連する問題