Sebagian besar basis data cukup jelas tentang fakta bahwa suatu ORDER BY
subquery adalah:
- Tidak diizinkan: Misalnya SQL Server, Sybase SQL Anywhere (kecuali dilengkapi dengan
TOP
atau OFFSET .. FETCH
)
- Tidak berarti: Misalnya PostgreSQL, DB2 (sekali lagi, kecuali dilengkapi dengan
OFFSET .. FETCH
atau LIMIT
)
Berikut adalah contoh dari manual LU2 DB2 (tambang penekanan)
Klausa ORDER BY dalam subselect tidak memengaruhi urutan baris yang dikembalikan oleh kueri. Klausa ORDER BY hanya memengaruhi urutan baris yang dikembalikan jika ditentukan dalam pemilihan penuh terluar.
Kata-katanya cukup eksplisit, seperti halnya PostgreSQL :
Jika penyortiran tidak dipilih, baris akan dikembalikan dalam urutan yang tidak ditentukan. Urutan aktual dalam kasus itu akan tergantung pada pemindaian dan bergabung dengan jenis paket dan urutan pada disk, tetapi tidak boleh diandalkan . Pemesanan keluaran tertentu hanya dapat dijamin jika langkah sortir dipilih secara eksplisit.
Dari spesifikasi ini, dapat dipastikan bahwa setiap pemesanan yang dihasilkan dari ORDER BY
klausa dalam tabel turunan hanyalah kebetulan dan mungkin secara kebetulan cocok dengan pemesanan yang Anda harapkan (yang dilakukannya di sebagian besar database dalam contoh sepele Anda), tetapi tidak bijaksana untuk mengandalkan ini.
Catatan tentang DB2:
Secara khusus, DB2 memiliki fitur yang kurang dikenalORDER BY ORDER OF <table-designator>
, yang dapat digunakan sebagai berikut:
SELECT C1 FROM
(SELECT C1 FROM T1
UNION
SELECT C1 FROM T2
ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE
Dalam kasus khusus ini, urutan tabel turunan dapat secara eksplisit digunakan kembali di paling luar SELECT
Catatan tentang Oracle:
Selama bertahun-tahun telah menjadi praktik di Oracle untuk mengimplementasikan OFFSET
pagination menggunakan ROWNUM
, yang dapat dihitung secara wajar hanya setelah memesan tabel turunan:
SELECT *
FROM (
SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
FROM (
SELECT * FROM table ORDER BY time DESC
) t
) t
WHERE rn BETWEEN 10 AND 20
Dapat diperkirakan bahwa setidaknya dengan adanya ROWNUM
permintaan, versi Oracle di masa depan tidak akan merusak perilaku ini agar tidak merusak hampir semua warisan Oracle SQL di luar sana, yang belum bermigrasi ke tempat yang jauh lebih diinginkan dan lebih disukai. OFFSET .. FETCH
Sintaks standar SQL yang dapat dibaca :
SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY