Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Fungsi grup SQL bersarang terlalu dalam

Salah satu cara untuk melakukannya adalah dengan membuat kueri Anda dan kemudian memilih baris pertama dalam output:

select C_SE_ID, cnt
from (select CS.C_SE_ID, count(*) as cnt
      from COURSE_SECTION CS join
           ENROLLMENT E
           on CS.C_SE_ID=E.C_SE_ID join
           LOCATION L
           on CS.LOC_ID=L.LOC_ID
      where L.BLDG_CODE='DBW'
      GROUP BY CS.C_SE_ID
      order by count(*) desc
     ) t
where rownum = 1

Catatan Saya memperbarui sintaks gabungan ke versi yang lebih modern menggunakan on alih-alih where .

Jika Anda ingin semua nilai minimum (dan ada lebih dari satu), maka saya akan menggunakan fungsi analitik. Ini adalah ide yang sangat mirip dengan kueri asli Anda:

select *
from (select CS.C_SE_ID, count(*) as cnt,
             max(count(*)) over (partition by cs.c_se_id) as maxcnt
      from COURSE_SECTION CS join
           ENROLLMENT E
           on CS.C_SE_ID=E.C_SE_ID join
           LOCATION L
           on CS.LOC_ID=L.LOC_ID
      where L.BLDG_CODE='DBW'
      GROUP BY CS.C_SE_ID
      order by count(*) desc
     ) t
where cnt = maxcnt;

Coba ini sebagai ganti kueri asli Anda:

SELECT E.S_ID
FROM ENROLLMENT E
where E.C_SE_ID in (select C_SE_ID
                    from (select CS.C_SE_ID, count(*) as cnt,
                                 max(count(*)) over (partition by cs.c_se_id) as maxcnt
                          from ENROLLMENT E
                               LOCATION L
                               on CS.LOC_ID=L.LOC_ID
                          where L.BLDG_CODE='DBW'
                          GROUP BY e.C_SE_ID
                         ) t
                    where cnt = maxcnt)
                   );

Selain memperbaiki gabungan, saya juga menghapus semua referensi ke course_section . Tabel ini tampaknya tidak digunakan (kecuali untuk memfilter hasil), dan menghapusnya menyiratkan kueri.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sesi Oracle yang tidak dapat dibunuh menunggu pesan SQL*Net dari acara klien

  2. Bagaimana cara menghindari nilai 0 menggunakan fungsi MIN dan MAX dalam SQL?

  3. Bagaimana Anda menetapkan hasil ekspresi ke variabel substitusi SQL?

  4. Fungsi LISTAGG:hasil penggabungan string terlalu panjang

  5. Bagaimana cara mengubah teks label tombol tekan dan menambahkan fungsionalitas baru saat runtime? Formulir Oracle