Misalnya, pertimbangkan permintaan SQL:
SELECT
A.[Name],
ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
[FooTable] AS A
Di sini saya amati hasil yang dikembalikan diurutkan berdasarkan A. [Nama]. Jika saya mengubah kolom sortir yang didefinisikan dalam fungsi ROW_NUMBER ke kolom lain, sekali lagi hasilnya menjadi diurutkan berdasarkan kolom itu.
Saya mengharapkan nomor baris untuk ditugaskan ke baris tetapi saya tidak mengharapkan baris untuk kembali diurutkan berdasarkan kriteria yang sama. Apakah ini hanya efek samping dari bagaimana kueri dieksekusi (dalam kasus saya di SQL Server 2008 R2) atau apakah perilaku ini dijamin? (Saya tidak dapat menemukan referensi untuk jaminan semacam itu).
sql-server-2008-r2
order-by
redcalx
sumber
sumber
Jawaban:
Jika Anda mengajukan pertanyaan, saya pikir Anda sebenarnya bermaksud untuk bertanya:
Kami dapat memberi tahu Anda untuk membuat alias untuk
ROW_NUMBER()
ekspresi, lalu mengurutkan menggunakan alias:Sekarang Anda hanya perlu mengubah ekspresi di satu tempat, dan jenis yang dihasilkan akan didasarkan pada ekspresi itu tanpa harus mengulanginya.
sumber
repeating the complex ORDER BY expression
bahkan tidak menjamin output akan keluar berdasarkan pesanan ROW_NUMBER (). Kecuali jika kolom dalam klausa ORDER BY membentuk kunci unik.Benar-benar tidak. Bukti:
Satu-satunya cara untuk menjamin pesanan dalam SQL adalah dengan memintanya, gunakan
ORDER BY
pada hasilnya sendiri.sumber
Sebenarnya pertanyaan (lama) dapat diperluas untuk juga menyertakan partisi dengan bagian, karena tampaknya ada urutan implisit dengan pertama partisi oleh dan kemudian urutan oleh bagian (s)
Jadi tidak sesederhana yang disarankan beberapa orang untuk menetapkan row_number dan menggunakannya untuk memesan.
Kita akan membutuhkan sql bersarang yang mengekstraksi partisi dengan klausa juga (jika kita tidak ingin hanya mengulanginya saja)
Secara empiris kita tampaknya mendapatkan baris terakhir dari pemesanan secara implisit
Tetapi yang kita kekurangan adalah bukti atau jaminan yang selalu ada.
(Jika ada beberapa panggilan Row_Number () yang dimainkan, itu adalah TERAKHIR yang tampaknya memberikan pemesanan)
JUGA CATATAN jika Anda secara eksplisit menambahkan pesanan dengan rencana eksekusi dengan jelas menunjukkan langkah-sortir akhir, dan mengurutkan set yang sudah diurutkan adalah jenis-kasus terburuk, maka dibutuhkan secara substansial lebih lama dengan Order By daripada tanpa
sumber