Di PostgreSQL ada Limit
dan Offset
kata kunci yang akan memungkinkan pagination set hasil yang sangat mudah.
Apa sintaks yang setara untuk SQL Server?
Di PostgreSQL ada Limit
dan Offset
kata kunci yang akan memungkinkan pagination set hasil yang sangat mudah.
Apa sintaks yang setara untuk SQL Server?
Jawaban:
Setara dengan LIMIT
itu SET ROWCOUNT
, tetapi jika Anda ingin pagination generik lebih baik menulis kueri seperti ini:
;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
Keuntungannya di sini adalah parameterisasi offset dan batas jika Anda memutuskan untuk mengubah opsi paging Anda (atau mengizinkan pengguna untuk melakukannya).
Catatan: yang @Offset
parameter harus menggunakan satu berbasis pengindeksan untuk ini daripada normal pengindeksan berbasis nol.
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
catatan saya memiliki 200 ribu, itu akan mengambil semuanya terlebih dahulu, lalu menerapkan batas? Apakah kueri ini efisien?
Fitur ini sekarang menjadi mudah di SQL Server 2012. Ini berfungsi dari SQL Server 2012 dan seterusnya.
Batasi dengan offset untuk memilih 11 hingga 20 baris di SQL Server:
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET
: jumlah baris yang dilewatiNEXT
: diperlukan jumlah baris berikutnyaSQL_CALC_FOUND_ROWS
saat menggunakan ini?
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}
Catatan:
Solusi ini hanya akan berfungsi di SQL Server 2005 atau lebih baru, karena ini adalah saat ROW_NUMBER()
diimplementasikan.
AS xx
Bagi saya penggunaan OFFSET dan FETCH bersama lambat, jadi saya menggunakan kombinasi TOP dan OFFSET seperti ini (yang lebih cepat):
SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
Catatan: Jika Anda menggunakan TOP dan OFFSET secara bersamaan dalam permintaan yang sama seperti:
SELECT TOP 20 columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
Kemudian Anda mendapatkan kesalahan, jadi untuk menggunakan TOP dan OFFSET bersama-sama Anda harus memisahkannya dengan sub-kueri.
Dan jika Anda perlu menggunakan SELECT DISTINCT maka kueri seperti:
SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
Catatan: Penggunaan SELECT ROW_NUMBER dengan DISTINCT tidak berhasil untuk saya.
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, Anda harus mengubahnya seperti SELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
. Saya akan mengedit jawaban saya. Terima kasih dan permisi Bahasa Inggris saya.
Sampel lain:
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;
Di sini ada seseorang yang menceritakan tentang fitur ini di sql 2011, sayangnya mereka memilih kata kunci yang sedikit berbeda "OFFSET / FETCH" tetapi tidak standar maka ok.
Menambahkan sedikit variasi pada solusi Aaronaught, saya biasanya menentukan nomor halaman (@PageNum) dan ukuran halaman (@PageSize). Dengan cara ini setiap klik acara acara hanya mengirimkan nomor halaman yang diminta bersama dengan ukuran halaman yang dapat dikonfigurasi:
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
Yang paling dekat yang bisa saya lakukan adalah
select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber and ct <= toNumber
Saya kira mirip dengan select * from [db].[dbo].[table] LIMIT 0, 10
-- @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
@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
Karena belum ada yang memberikan kode ini:
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...
Poin-poin penting:
@limit
dapat diganti dengan jumlah hasil yang akan diambil,@offset
adalah jumlah hasil untuk dilewatiwhere
dan order by
klausa, dan akan memberikan hasil yang salah jika mereka tidak sinkronorder by
ada secara eksplisit jika itu yang dibutuhkanKhusus untuk SQL-SERVER Anda dapat mencapainya dengan berbagai cara. Untuk memberikan contoh nyata, kami mengambil tabel Pelanggan di sini.
Contoh 1: Dengan "SET ROWCOUNT"
SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
Untuk mengembalikan semua baris, atur ROWCOUNT ke 0
SET ROWCOUNT 0
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
Contoh 2: Dengan "ROW_NUMBER dan 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
Contoh 3: Dengan "OFFSET dan FETCH", Tetapi dengan "ORDER BY" ini wajib
SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
Semoga ini bisa membantu Anda.
Karena, saya menguji lebih banyak skrip ini lebih bermanfaat dengan 1 juta catatan setiap halaman 100 catatan dengan pagination berfungsi lebih cepat PC saya mengeksekusi skrip ini 0 detik sementara dibandingkan dengan mysql memiliki batas sendiri dan mengimbangi sekitar 4,5 detik untuk mendapatkan hasilnya.
Seseorang mungkin kehilangan pemahaman Row_Number () selalu urutkan berdasarkan bidang tertentu. Jika kita perlu mendefinisikan hanya baris secara berurutan yang harus digunakan:
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}
Menjelaskan: