Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja grupy SQL zagnieżdżona zbyt głęboko

Jednym ze sposobów, aby to zrobić, jest zagnieżdżenie zapytania, a następnie wybranie pierwszego wiersza w danych wyjściowych:

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

Uwaga Zaktualizowałem składnię łączenia do bardziej nowoczesnej wersji za pomocą on zamiast where .

Jeśli chcesz wszystkie wartości minimalne (a jest ich więcej niż jeden), wtedy użyłbym funkcji analitycznych. Jest to bardzo podobny pomysł do pierwotnego zapytania:

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;

Wypróbuj to zamiast oryginalnego zapytania:

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)
                   );

Oprócz naprawienia łączeń usunąłem również wszystkie odniesienia do course_section . Ta tabela nie wydaje się być używana (chyba że do filtrowania wyników), a jej usunięcie implikuje zapytania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kroczące 90-dniowe okno daty w SQL Oracle

  2. Jak zliczyć osoby na podstawie grup wiekowych za pomocą zapytania SQL w bazie danych Oracle?

  3. Częsty błąd w Oracle ORA-04068:istniejący stan pakietów został odrzucony

  4. Jak zresetować sekwencję w Oracle?

  5. Korzyści z nauki nowych systemów DB