Saya menggunakan aplikasi (MapServer - http://mapserver.org/ ) yang membungkus pernyataan SQL, sehingga pernyataan ORDER BY berada dalam permintaan dalam. Misalnya
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Aplikasi ini memiliki banyak driver basis data yang berbeda. Saya terutama menggunakan driver MS SQL Server, dan SQL Server 2008. Ini melempar kesalahan jika ORDER BY ditemukan dalam subquery.
Dari MS Documents (meskipun ini untuk SQL Server 2000 sepertinya masih berlaku):
Saat Anda menggunakan klausa ORDER BY dalam tampilan, fungsi inline, tabel turunan, atau subquery, itu tidak menjamin output yang dipesan. Sebagai gantinya, klausa ORDER BY hanya digunakan untuk menjamin bahwa set hasil yang dihasilkan oleh operator Top memiliki susunan yang konsisten. Klausa ORDER BY hanya menjamin hasil yang dipesan ditetapkan ketika ditentukan dalam pernyataan SELECT terluar.
Namun jenis kueri yang sama ketika dijalankan di Postgres (9) dan Oracle mengembalikan hasil - dengan urutan seperti yang didefinisikan dalam subquery. Dalam Postgres, rencana kueri menunjukkan hasilnya diurutkan dan catatan rilis Postgres menyertakan item yang menyiratkan pesanan subquery digunakan:
Hindari pengurutan saat subquery ORDER BY cocok dengan kueri atas
http://en.wikipedia.org/wiki/Order_by menyatakan:
Meskipun beberapa sistem basis data mengizinkan spesifikasi klausa ORDER BY dalam subselect atau melihat definisi, keberadaannya tidak berpengaruh.
Namun dari pengecekan saya sendiri dari rencana permintaan:
- SQL Server 2008 tidak mendukung ORDER OLEH dalam subquery
- Postgres 9 mendukung ORDER BY dalam subquery
- Oracle 10g mendukung ORDER BY dalam subquery
Jadi pertanyaan saya apakah ada tautan yang secara resmi dapat mengkonfirmasi atau menyangkal bahwa Postgres dan Oracle tidak mengizinkan pengurutan dalam subquery?
sumber
ORDER BY
subquery sebagai berlebihan dan tidak melakukan penyortiran yang tidak perlu.Jawaban:
Anda harus membuat aplikasi Anda tidak menempatkan bagian
ORDER BY
dalam subquery (mungkin memiliki opsi untuk tidak menggunakan subquery yang tidak perlu di tempat pertama). Seperti yang sudah Anda temukan, sintaks ini tidak didukung di SQL Server tanpaTOP
. Dan denganTOP
, kecuali Anda ingin mengabaikan beberapa baris, menggunakanTOP 100 PERCENT
akan membuat yangORDER BY
dioptimalkan tetap pergi.Dan di Oracle dan PostGres, hanya karena sintaks yang didukung , tidak berarti itu dipatuhi. Dan hanya karena Anda mengamatinya sebagai ditaati dalam beberapa skenario, tidak berarti itu akan terus dipatuhi saat versi baru keluar atau dengan perubahan halus pada data Anda, statistik, kueri itu sendiri, atau lingkungan.
Saya dapat meyakinkan Anda bahwa, tanpa keraguan , jika Anda ingin jaminan tentang pesanan, Anda harus memasukkan
ORDER BY
permintaan yang paling luar. Ini harus menjadi doktrin yang Anda pegang erat-erat, apa pun platform yang Anda gunakan.Anda meminta tautan yang secara resmi menyatakan bahwa ada sesuatu yang tidak didukung. Ini seperti melihat di manual pemilik mobil Anda untuk pernyataan resmi bahwa mobil Anda tidak bisa terbang.
sumber
Saya akui ini busuk tetapi jika Anda dalam keadaan darurat coba kembalikan jumlah baris teratas dalam subquery. Mengembalikan 100 persen teratas tidak berfungsi tetapi jika Anda ingin mengatasi masalah, Anda dapat meminta jumlah baris dan meneruskannya ke TOP sebagai variabel. Saya menguji ini pada set database ke tingkat kompatibilitas 80 jadi saya pikir ini harus bekerja dengan SQL 2000.
sumber
Name
tidak unik. Ini mungkin tidak terus bekerja secara seri jika optimizer memilih indeks yang berbeda, dengan urutan kolom kunci yang berbeda.