Di PostgreSQL ada Limit
dan Offset
kata kunci yang akan memungkinkan pagination set hasil yang sangat mudah.
Apa sintaks yang setara untuk SQL Server?
sql
sql-server
pagination
limit
offset
Earlz
sumber
sumber
Jawaban:
Setara dengan
LIMIT
ituSET ROWCOUNT
, tetapi jika Anda ingin pagination generik lebih baik menulis kueri seperti ini: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.sumber
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:
OFFSET
: jumlah baris yang dilewatiNEXT
: diperlukan jumlah baris berikutnyaReferensi: https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
sumber
SQL_CALC_FOUND_ROWS
saat menggunakan ini?Catatan: Solusi ini hanya akan berfungsi di SQL Server 2005 atau lebih baru, karena ini adalah saat
ROW_NUMBER()
diimplementasikan.sumber
AS xx
Anda dapat menggunakan ROW_NUMBER dalam Ekspresi Tabel Umum untuk mencapai ini.
sumber
Bagi saya penggunaan OFFSET dan FETCH bersama lambat, jadi saya menggunakan kombinasi TOP dan OFFSET seperti ini (yang lebih cepat):
Catatan: Jika Anda menggunakan TOP dan OFFSET secara bersamaan dalam permintaan yang sama seperti:
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:
Catatan: Penggunaan SELECT ROW_NUMBER dengan DISTINCT tidak berhasil untuk saya.
sumber
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
, Anda harus mengubahnya sepertiSELECT 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:
sumber
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.
sumber
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:
sumber
Yang paling dekat yang bisa saya lakukan adalah
Saya kira mirip dengan
select * from [db].[dbo].[table] LIMIT 0, 10
sumber
sumber
sumber
sumber
Karena belum ada yang memberikan kode ini:
Poin-poin penting:
@limit
dapat diganti dengan jumlah hasil yang akan diambil,@offset
adalah jumlah hasil untuk dilewatiwhere
danorder by
klausa, dan akan memberikan hasil yang salah jika mereka tidak sinkronorder by
ada secara eksplisit jika itu yang dibutuhkansumber
Khusus untuk SQL-SERVER Anda dapat mencapainya dengan berbagai cara. Untuk memberikan contoh nyata, kami mengambil tabel Pelanggan di sini.
Contoh 1: Dengan "SET ROWCOUNT"
Untuk mengembalikan semua baris, atur ROWCOUNT ke 0
Contoh 2: Dengan "ROW_NUMBER dan OVER"
Contoh 3: Dengan "OFFSET dan FETCH", Tetapi dengan "ORDER BY" ini wajib
Semoga ini bisa membantu Anda.
sumber
Di SQL server Anda akan menggunakan TOP bersama dengan ROW_NUMBER ()
sumber
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:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL))
Menjelaskan:
sumber