PostgreSQLには、結果セットの非常に簡単なページ付けを可能にするLimit
andOffset
キーワードがあります。
SQL Serverの同等の構文は何ですか?
PostgreSQLには、結果セットの非常に簡単なページ付けを可能にするLimit
andOffset
キーワードがあります。
SQL Serverの同等の構文は何ですか?
この機能は、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
と同等ですLIMIT
がSET 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ベースのインデックスを使用する必要があります。
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()
実装されたときであるためです。
これを実現するために、共通テーブル式で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
特に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
これがお役に立てば幸いです。
私にとって、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の使用は、私には機能しませんでした。
-- @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
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
別のサンプル:
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;
SQL 2011でこの機能について話している人がいます。悲しいことに、彼らは少し異なるキーワード「OFFSET / FETCH」を選択しますが、標準ではありません。
私が作ることができる最も近いものは
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
select top (@TakeCount) * --FETCH NEXT
from(
Select ROW_NUMBER() OVER (order by StartDate) AS rowid,*
From YourTable
)A
where Rowid>@SkipCount --OFFSET
@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
まだ誰もこのコードを提供していないので:
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...
重要なポイント:
@limit
取得する結果の数に置き換えることができます、@offset
スキップする結果の数ですwhere
し、order by
句があり、同期していない場合は誤った結果を提供しますorder by
が必要な場合は明示的に存在しますSomnath-Mulukの答えを詳しく説明するには、次を使用します。
SELECT *
FROM table_name_here
ORDER BY (SELECT NULL AS NOORDER)
OFFSET 9 ROWS
FETCH NEXT 25 ROWS ONLY
余分な列を追加しません。SQL Server 2019でテストされていますが、古いものでも機能する可能性があります。
SQLサーバーでは、TOPをROW_NUMBER()と一緒に使用します。
私はこのスクリプトをより多くの回数テストするので、ページごとに100万レコードずつ、ページ付けのある100レコードの方が速く動作します。私のPCは、このスクリプトを0秒実行しますが、mysqlと比較すると、結果を得るために独自の制限とオフセットが約4.5秒あります。
Row_Number()が常に特定のフィールドでソートされることを理解できない人がいるかもしれません。行のみを順番に定義する必要がある場合は、次を使用する必要があります。
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}
説明: