Saya mencoba melakukan sesuatu seperti:
SELECT * FROM table LIMIT 10,20
atau
SELECT * FROM table LIMIT 10 OFFSET 10
tetapi menggunakan SQL Server
Satu-satunya solusi yang saya temukan sepertinya berlebihan:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Saya juga menemukan :
SELECT TOP 10 * FROM stuff;
... tapi bukan itu yang ingin saya lakukan karena saya tidak bisa menentukan batas awal.
Apakah ada cara lain bagi saya untuk melakukan itu?
Juga, hanya ingin tahu, apakah ada alasan mengapa SQL Server tidak mendukung LIMIT
fungsi atau yang serupa? Saya tidak ingin menjadi kejam, tapi itu benar-benar terdengar seperti sesuatu yang dibutuhkan DBMS ... Jika ya, maka saya minta maaf karena begitu bodoh! Saya telah bekerja dengan MySQL dan SQL + selama 5 tahun terakhir jadi ...
sql
sql-server
pagination
limit
marcgg
sumber
sumber
ROW_NUMBER()
dan membatasi denganTOP
untuk lebar rentang danWHERE
kondisi untuk batas jangkauan adalah yang terbaik yang bisa saya capai. Saya juga memperhatikan kinerja yang jauh lebih baik jikaTOP
klausa menggunakan variabel literal dan bukan variabelJawaban:
The
LIMIT
klausul bukan bagian dari SQL standar. Ini didukung sebagai ekstensi vendor ke SQL oleh MySQL, PostgreSQL, dan SQLite.Basis data merek lain mungkin memiliki fitur serupa (misalnya
TOP
dalam Microsoft SQL Server), tetapi ini tidak selalu berfungsi secara identik.Sulit digunakan
TOP
di Microsoft SQL Server untuk meniruLIMIT
klausa. Ada kasus di mana itu tidak berfungsi.Solusi yang Anda tunjukkan, menggunakan
ROW_NUMBER()
tersedia di Microsoft SQL Server 2005 dan yang lebih baru. Ini adalah solusi terbaik (untuk saat ini) yang hanya berfungsi sebagai bagian dari kueri.Solusi lain adalah menggunakan
TOP
untuk mengambil hitungan + baris offset pertama , dan kemudian menggunakan API untuk mencari melewati baris offset pertama .Lihat juga:
sumber
Untuk SQL Server 2012 + dapat Anda gunakan .
sumber
offset
, atau bisakah Anda meninggalkan garis itu (dengan asumsi Anda tidak ingin offset)?OFFSET 0 ROWS
Parse error at line: 4, column: 1: Incorrect syntax near 'OFFSET'
seperti yang Anda temukan, ini adalah metode server sql yang disukai:
sumber
a
setelah inner pilih? Saya berasumsi Anda memberikan nama alias pilih bagian dalam, tetapi kemudian Anda sepertinya tidak pernah menggunakannya ... Haruskah Anda melakukannyaa.row
sebagai ganti hanyarow
?( )
tabel turunan, tetapi ia akan membiarkannya pergi jika Anda kemudian lupa menggunakannya untuk merujuk ke kolom. Saya memperbaikinya ...Jika Anda menggunakan SQL Server 2012+ suara untuk jawaban Martin Smith dan menggunakan
OFFSET
danFETCH NEXT
ekstensi untukORDER BY
,Jika Anda kurang beruntung terjebak dengan versi sebelumnya, Anda bisa melakukan sesuatu seperti ini,
Saya percaya secara fungsional setara dengan
dan cara berkinerja terbaik yang saya tahu melakukannya di TSQL, sebelum MS SQL 2012.
Jika ada sangat banyak baris, Anda mungkin mendapatkan kinerja yang lebih baik menggunakan tabel temp daripada CTE.
sumber
Sayangnya,
ROW_NUMBER()
ini adalah yang terbaik yang dapat Anda lakukan. Ini sebenarnya lebih benar, karena hasil dari alimit
atautop
klausa tidak benar-benar memiliki makna tanpa memperhatikan beberapa urutan tertentu. Tapi itu masih menyakitkan untuk dilakukan.Pembaruan: Sql Server 2012 menambahkan
limit
fitur- like via kata kunci OFFSET dan FETCH . Ini adalah pendekatan ansi-standar, yang bertentangan denganLIMIT
, yang merupakan ekstensi MySql non-standar.sumber
Bagaimana dengan ini?
Ini memberi Anda 10 baris terakhir dari 20 baris pertama. Salah satu kelemahannya adalah urutannya terbalik, tetapi setidaknya mudah diingat.
sumber
Harus memberi catatan 11-20. Mungkin tidak terlalu efisien jika menambah untuk mendapatkan halaman lebih lanjut, dan tidak yakin bagaimana itu akan terpengaruh oleh pemesanan. Mungkin harus menentukan ini di kedua pernyataan WHERE.
sumber
Cara yang baik adalah membuat prosedur:
seperti batas 0,2 /////////////// jalankan pagination 0,4
sumber
Hanya untuk solusi rekam yang bekerja di sebagian besar mesin basis data meskipun mungkin bukan yang paling efisien:
Catatan Pelase: halaman terakhir masih berisi baris ReturnCount tidak peduli apa SkipCount itu. Tetapi itu mungkin merupakan hal yang baik dalam banyak kasus.
sumber
Setara dengan LIMIT adalah SET ROWCOUNT, tetapi jika Anda ingin pagination umum lebih baik menulis kueri seperti ini:
sumber
Akan mencetak baris dari 10 hingga 15.
sumber
Sejauh ini format ini berfungsi untuk saya (bukan performa terbaik):
Catatan di sampingnya, penomoran data dinamis dapat menyebabkan hasil yang aneh / tidak terduga.
sumber
Dari dokumentasi online MS SQL Server ( http://technet.microsoft.com/en-us/library/ms186734.aspx ), berikut ini adalah contoh mereka yang telah saya uji dan bekerja, untuk mengambil serangkaian baris tertentu. ROW_NUMBER membutuhkan OVER, tetapi Anda dapat memesan dengan apa pun yang Anda suka:
sumber
Gunakan semua server SQL:; dengan tbl sebagai (SELECT ROW_NUMBER () di atas (pesan oleh (pilih 1)) sebagai RowIndex, * from table) pilih top 10 * dari tbl di mana RowIndex> = 10
sumber
itu akan mencetak 15-25 sebagai batas seperti di MYSQl
sumber