Pemilihan Rekod 10 Teratas Oracle dengan Pengecualian Tarikh
Artikel ini menangani cabaran pangkalan data Oracle biasa: mendapatkan semula 10 rekod teratas yang dipesan mengikut lajur tertentu, pada masa yang sama mengecualikan rekod yang sepadan dengan kriteria tertentu daripada jadual lain. SELECT DISTINCT
mudah dengan klausa ORDER BY
dan ROWNUM
tidak akan mencukupi kerana interaksi unsur-unsur ini.
Penyelesaian menggunakan subkueri untuk mencapai hasil yang diinginkan:
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM HISTORY h2 WHERE h2.APP_ID = HISTORY.APP_ID AND TO_CHAR(h2.HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009' ) ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10;</code>
Pendekatan ini menapis dahulu jadual HISTORY
dalam pertanyaan dalam. Klausa NOT EXISTS
dengan cekap mengecualikan rekod yang APP_ID
sepadan dengan rekod dengan HISTORY_DATE
bersamaan dengan '06.02.2009'. Keputusan kemudiannya dipesan dengan STORAGE_GB
(menurun). Pertanyaan luar menggunakan kekangan ROWNUM <= 10
, memastikan hanya 10 rekod teratas dikembalikan. Kaedah ini menggunakan had baris dengan betul selepas penapisan dan pesanan, menjamin hasil yang tepat.
Nota: NOT EXISTS
secara amnya menawarkan prestasi yang lebih baik daripada NOT IN
untuk jenis pengecualian ini, terutamanya dengan set data yang besar. Rujuk dokumentasi Oracle untuk strategi pengoptimuman prestasi selanjutnya.
Atas ialah kandungan terperinci Bagaimana untuk Memilih 10 Rekod Oracle Teratas Walaupun Tidak Termasuk Tarikh Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!