SQL Server Error, "Penggunaan opsi FIRST yang tidak valid dalam pernyataan FETCH."

8

Dari 2012 dan seterusnya, SQL Server docs menunjukkan bahwa mereka mendukung OFFSET..FETCHyang saya coba gunakan daripada a LIMIT.

Berikut ini berfungsi dengan baik di PostgreSQL untuk mencicipi kumpulan hasil,

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Namun, dengan SQL Server, saya mengerti

Msg 153, Level 15, State 2, Line 4
Invalid usage of the option FIRST in the FETCH statement.

Apa yang terjadi di sini? Apakah SQL Server mendukung standar OFFSET.. FETCH?

Evan Carroll
sumber

Jawaban:

17

SQL Server telah mengimplementasikan OFFSETdan FETCHklausa sebagai bagian dari ORDER BYklausa, seperti yang ditunjukkan oleh jawaban lain dan didokumentasikan dalam dokumentasi mereka.

Standar SQL di sisi lain, memiliki kedua klausa ini sebagai independen:

<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ]

Jika seseorang ingin fitur ini diterapkan sepenuhnya sesuai dengan standar, mereka selalu dapat membuat permintaan ke tim SQL Server, melalui saluran Connect. Bahkan, MS telah berkomentar - dalam permintaan berbeda tentang offset dan pengambilan:

Hubungkan item: SQL Denali: tambahkan penghitung baris total ke SELECTpernyataan - oleh Alexey Rokhin

Jawaban: Diposting oleh Microsoft pada 24/11/2010 pada 11:34

Persyaratan yang OFFSET/FETCHmensyaratkan ORDER BYadalah batasan dalam rilis ini. Dalam standar SQL ANSI (SQL: 2011) di mana OFFSET/FETCHklausa baru diusulkan, ORDER BYadalah opsional. Pembatasan dalam SQL Server berkaitan dengan keterbatasan dalam teknologi parser kami yang tidak dapat menangani sintaks opsional tanpa membuat OFFSETkata kunci yang dipesan. Kami dapat menghapusnya di masa mendatang.

Sekarang sehubungan dengan ...

Sampai saat itu, jika seseorang ingin menggunakan OFFSETdan FETCHtanpa spesifik ORDER BY, solusinya adalah menambahkan perintah "tidak melakukan apa pun" dengan klausa. Contoh:

SELECT 
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
ypercubeᵀᴹ
sumber
10

Sebagaimana dinyatakan di bagian paling atas dari dokumentasi pada OFFSET..FETCH

Klausa OFFSET-FETCH memberi Anda opsi untuk mengambil hanya jendela atau halaman hasil dari set hasil. OFFSET-FETCH hanya dapat digunakan dengan klausa ORDER BY.

...

ORDER BY wajib untuk menggunakan klausa OFFSET dan FETCH.

Begitu,

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY t.[x]  /* <-- ADD ME TO BE HAPPY */
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Tidak semua yang praktis untuk yang sederhana LIMITjika itu yang Anda ingin Anda akan tetap dengan TOP.

Solomon Rutzky
sumber
9

Menurut referensi , OFFSETklausa adalah bagian dari ORDER BYSQL Server. Anda juga perlu menambahkan ROWSkata kunci setelah OFFSETspesifikasi:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
Dan Guzman
sumber