PostgreSQLには、結果セットの非常に簡単なページ分割を可能にするLimit
とOffset
キーワードがあります。
SQL Serverの同等の構文は何ですか?
PostgreSQLには、結果セットの非常に簡単なページ分割を可能にするLimit
とOffset
キーワードがあります。
SQL Serverの同等の構文は何ですか?
回答:
LIMIT
is 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ベースのインデックスを使用する必要があります。
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
。MSSQL2008 R2。
Table
件のレコードがある場合、最初にすべて取得してから制限を適用しますか このクエリは効率的ですか?
この機能はSQL Server 2012で簡単になりました。これはSQL Server 2012以降で機能します。
SQL Serverで11〜20行を選択するには、オフセットで制限します。
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET
:スキップされた行の数NEXT
:必要な次の行数リファレンス:https : //docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
SQL_CALC_FOUND_ROWS
これを使用する場合の同等物はありますか?
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()
。
AS xx
私にとって、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を使用しても機能しませんでした。
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
に変換する必要がありますSELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
。回答を編集します。ありがとう、すみません、私の英語。
別のサンプル:
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」彼らは少し異なったキーワードを選択するが、そのないスタンダール[OK]を。
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
私が作ることができる最も近いものは
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
@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
が必要な場合は明示的にあります具体的にはSQL-SERVERの場合、さまざまな方法でそれを実現できます。実際の例として、ここではCustomerテーブルを取り上げました。
例1:「SET ROWCOUNT」を使用する
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_NUMBERおよびOVER」を使用
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 and FETCH"を使用するが、これを使用する場合 "ORDER BY"は必須
SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
これがお役に立てば幸いです。
なぜなら、私はこのスクリプトをより多くの回数テストします。ページごとに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}
説明: