199

PostgreSQLには、結果セットの非常に簡単なページ付けを可能にするLimitandOffsetキーワードがあります。

SQL Serverの同等の構文は何ですか?

4

17 に答える 17

278

この機能は、SQL Server 2012で簡単になりました。これは、SQLServer2012以降で機能します。

SQL Serverで11〜20行を選択するには、オフセットで制限します。

SELECT email FROM emailTable 
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
  • ORDER BY: 必要
  • OFFSET:スキップされた行のオプションの数
  • NEXT:必要な次の行数

参照:https ://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql

于 2012-02-13T13:57:40.057 に答える
146

と同等ですLIMITSET ROWCOUNT、一般的なページネーションが必要な場合は、次のようなクエリを作成することをお勧めします。

;WITH Results_CTE AS
(
    SELECT
        Col1, Col2, ...,
        ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
    FROM Table
    WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit

ここでの利点は、ページングオプションを変更する(またはユーザーが変更できるようにする)場合に備えて、オフセットと制限をパラメーター化できることです。

注:@Offsetパラメーターは、通常のゼロベースのインデックスではなく、1ベースのインデックスを使用する必要があります。

于 2010-01-25T20:37:32.753 に答える
27
select top {LIMIT HERE} * from (
      select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n 
      from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
) xx where r_n_n >={OFFSET HERE}

注: このソリューションは、SQL Server 2005以降でのみ機能します。これは、ROW_NUMBER()実装されたときであるためです。

于 2013-03-26T21:44:20.727 に答える
12

これを実現するために、共通テーブル式でROW_NUMBERを使用できます。

;WITH My_CTE AS
(
     SELECT
          col1,
          col2,
          ROW_NUMBER() OVER(ORDER BY col1) AS row_number
     FROM
          My_Table
     WHERE
          <<<whatever>>>
)
SELECT
     col1,
     col2
FROM
     My_CTE
WHERE
     row_number BETWEEN @start_row AND @end_row
于 2010-01-25T20:40:27.233 に答える
5

特にSQL-SERVERの場合、さまざまな方法でこれを実現できます。実際の例として、ここでCustomerテーブルを取り上げました。

例1:「SETROWCOUNT」を使用

SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName

すべての行を返すには、ROWCOUNTを0に設定します

SET ROWCOUNT 0  
SELECT CustomerID, CompanyName from Customers
    ORDER BY CompanyName

例2:「ROW_NUMBERandOVER」を使用

With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber 
FROM Customers )
select *
from Cust
Where RowNumber Between 0 and 10

例3:「OFFSETとFETCH」を使用しますが、この「ORDERBY」は必須です

SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY

これがお役に立てば幸いです。

于 2019-12-26T10:36:01.940 に答える
4

私にとって、OFFSETとFETCHを一緒に使用するのは遅かったので、TOPとOFFSETを次のように組み合わせて使用​​しました(これはより高速でした)。

SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
    WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname

注:次のように、同じクエリでTOPとOFFSETを一緒に使用する場合:

SELECT TOP 20 columname1, columname2 FROM tablename
    WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS

次にエラーが発生するため、TOPとOFFSETを一緒に使用するには、サブクエリで区切る必要があります。

また、SELECT DISTINCTを使用する必要がある場合、クエリは次のようになります。

SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
    WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname

注: DISTINCTでのSELECT ROW_NUMBERの使用は、私には機能しませんでした。

于 2017-02-22T14:10:37.323 に答える
4
-- @RowsPerPage  can be a fixed number and @PageNumber number can be passed 
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 2

SELECT *

FROM MemberEmployeeData

ORDER BY EmployeeNumber

OFFSET @PageNumber*@RowsPerPage ROWS

FETCH NEXT 10 ROWS ONLY
于 2017-07-27T03:29:40.283 に答える
3

Aaronaughtのソリューションにわずかなバリエーションを追加して、通常、ページ番号(@PageNum)とページサイズ(@PageSize)をパラメーター化します。このように、各ページクリックイベントは、構成可能なページサイズとともに要求されたページ番号を送信するだけです。

begin
    with My_CTE  as
    (
         SELECT col1,
              ROW_NUMBER() OVER(ORDER BY col1) AS row_number
     FROM
          My_Table
     WHERE
          <<<whatever>>>
    )
    select * from My_CTE
            WHERE RowNum BETWEEN (@PageNum - 1) * (@PageSize + 1) 
                              AND @PageNum * @PageSize

end
于 2013-02-26T23:32:27.813 に答える
2

別のサンプル:

declare @limit int 
declare @offset int 
set @offset = 2;
set @limit = 20;
declare @count int
declare @idxini int 
declare @idxfim int 
select @idxfim = @offset * @limit
select @idxini = @idxfim - (@limit-1);
WITH paging AS
    (
        SELECT 
             ROW_NUMBER() OVER (order by object_id) AS rowid, *
        FROM 
            sys.objects 
    )
select *
    from 
        (select COUNT(1) as rowqtd from paging) qtd, 
            paging 
    where 
        rowid between @idxini and @idxfim
    order by 
        rowid;
于 2011-07-06T16:59:37.287 に答える
2

SQL 2011でこの機能について話している人がいます。悲しいことに、彼らは少し異なるキーワード「OFFSET / FETCH」を選択しますが、標準ではありません。

于 2011-08-17T12:36:19.663 に答える
2

私が作ることができる最も近いものは

select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber  and ct <= toNumber

私はこれに似ていると思いますselect * from [db].[dbo].[table] LIMIT 0, 10

于 2013-11-14T11:01:36.483 に答える
1
select top (@TakeCount) * --FETCH NEXT
from(
    Select  ROW_NUMBER() OVER (order by StartDate) AS rowid,*
    From YourTable
)A
where Rowid>@SkipCount --OFFSET
于 2016-02-19T15:28:55.457 に答える
1
@nombre_row :nombre ligne par page  
@page:numero de la page

//--------------code sql---------------

declare  @page int,@nombre_row int;
    set @page='2';
    set @nombre_row=5;
    SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
      FROM      etudiant

    ) AS RowConstrainedResult
WHERE   RowNum >= ((@page-1)*@nombre_row)+1
    AND RowNum < ((@page)*@nombre_row)+1
ORDER BY RowNum
于 2016-07-25T11:51:16.547 に答える
1

まだ誰もこのコードを提供していないので:

SELECT TOP @limit f1, f2, f3...
FROM t1
WHERE c1 = v1, c2 > v2...
AND
    t1.id NOT IN
        (SELECT TOP @offset id
         FROM t1
         WHERE c1 = v1, c2 > v2...
         ORDER BY o1, o2...)
ORDER BY o1, o2...

重要なポイント:

  • ORDERBYは同一である必要があります
  • @limit取得する結果の数に置き換えることができます、
  • @offsetスキップする結果の数です
  • 以前のソリューションの方が効率的である可能性があるため、パフォーマンスを比較してください
  • このソリューションは重複whereし、order by句があり、同期していない場合は誤った結果を提供します
  • 一方、それorder byが必要な場合は明示的に存在します
于 2016-09-19T09:41:58.787 に答える
0

Somnath-Mulukの答えを詳しく説明するには、次を使用します。

SELECT *
FROM table_name_here
ORDER BY (SELECT NULL AS NOORDER)
OFFSET 9 ROWS 
FETCH NEXT 25 ROWS ONLY 

余分な列を追加しません。SQL Server 2019でテストされていますが、古いものでも機能する可能性があります。

于 2021-08-17T20:12:48.717 に答える
-1

SQLサーバーでは、TOPをROW_NUMBER()と一緒に使用します。

于 2010-01-25T20:39:44.987 に答える
-1

私はこのスクリプトをより多くの回数テストするので、ページごとに100万レコードずつ、ページ付けのある100レコードの方が速く動作します。私のPCは、このスクリプトを0秒実行しますが、mysqlと比較すると、結果を得るために独自の制限とオフセットが約4.5秒あります。

Row_Number()が常に特定のフィールドでソートされることを理解できない人がいるかもしれません。行のみを順番に定義する必要がある場合は、次を使用する必要があります。

ROW_NUMBER()OVER(ORDER BY(SELECT NULL))

SELECT TOP {LIMIT} * FROM (
      SELECT TOP {LIMIT} + {OFFSET} ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ROW_NO,*
      FROM  {TABLE_NAME}
) XX WHERE ROW_NO > {OFFSET}

説明:

  • {LIMIT}:各ページのレコード数
  • {オフセット}:スキップレコードの数
于 2020-04-12T15:31:11.930 に答える