Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memilih 10 Rekod Teratas dalam Oracle dengan Cekap dengan Penapisan dan Pemesanan?

Bagaimana untuk Memilih 10 Rekod Teratas dalam Oracle dengan Cekap dengan Penapisan dan Pemesanan?

Linda Hamilton
Lepaskan: 2025-01-18 15:42:11
asal
166 orang telah melayarinya

How to Efficiently Select the Top 10 Records in Oracle with Filtering and Ordering?

Pemilihan Rekod 10 Teratas Oracle: Penapisan, Susunan dan Pengoptimuman

Mendapatkan semula sepuluh rekod teratas dalam Oracle biasanya mudah, tetapi menambah penapis dan mengutamakan prestasi memperkenalkan cabaran. Soalan Limpahan Tindanan baru-baru ini menyerlahkan perkara ini, memfokuskan pada memilih sepuluh rekod teratas berdasarkan lajur tertentu sambil mengecualikan rekod yang memenuhi syarat tertentu.

Pertanyaan Asal dan Kekurangannya

Pertanyaan SQL awal bertujuan untuk memilih rekod unik berdasarkan beberapa kriteria: kapasiti storan bukan nol, pengecualian rekod dari tarikh tertentu dan susunan menurun mengikut kapasiti storan. Pertanyaan itu, bagaimanapun, gagal mengehadkan keputusan dengan betul kepada sepuluh teratas.

<code class="language-sql">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 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>
Salin selepas log masuk

Hanya menambah ROWNUM <= 10 pada pertanyaan ini tidak akan menghasilkan 10 teratas yang betul kerana ROWNUM diberikan sebelum fasal ORDER BY diproses.

Penyelesaian: Pendekatan Subkueri

Penyelesaian yang berkesan menggunakan subkueri untuk menggunakan penapisan dan pesanan dengan betul:

<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 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10</code>
Salin selepas log masuk

Struktur bersarang ini memastikan rekod dipesan dahulu, kemudian sepuluh teratas dipilih.

Peningkatan Prestasi

Di luar pembetulan susunan, menggunakan EXISTS bukannya NOT IN meningkatkan prestasi dengan ketara. EXISTS secara amnya menawarkan peluang pengoptimuman yang lebih baik, meminimumkan penyertaan dan meningkatkan kelajuan pelaksanaan pertanyaan.

Atas ialah kandungan terperinci Bagaimana untuk Memilih 10 Rekod Teratas dalam Oracle dengan Cekap dengan Penapisan dan Pemesanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan