Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função de grupo SQL aninhada muito profundamente


Uma maneira de fazer isso é aninhando sua consulta e escolhendo a primeira linha na saída:
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

Observe que atualizei a sintaxe de junção para a versão mais moderna usando on em vez de where .

Se você quiser todos valores mínimos (e há mais de um), então eu usaria funções analíticas. É uma ideia muito semelhante à sua consulta original:
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;

Tente isso em vez de sua consulta original:
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)
                   );

Além de corrigir as junções, também removi todas as referências a course_section . Essa tabela não parece ser usada (a menos que seja para filtrar resultados) e removê-la simplifica as consultas.