Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL груповата функция е вложена твърде дълбоко

Един от начините да направите това е като вложите вашата заявка и след това изберете първия ред в изхода:

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

Забележка:Актуализирах синтаксиса за присъединяване към по-модерната версия, използвайки on вместо where .

Ако искате всички минимални стойности (и има повече от една), тогава бих използвал аналитични функции. Идеята е много подобна на оригиналната ви заявка:

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;

Опитайте това вместо първоначалната си заявка:

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

В допълнение към коригирането на присъединяванията, премахнах и всички препратки към course_section . Тази таблица изглежда не се използва (освен за филтриране на резултати) и премахването й загатва за заявките.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DB Control наближава смъртта си

  2. Преминете през предварително зададени стойности

  3. Анализирайте XML низ, съхранен в Oracle Table

  4. Експортиране на файл с последователност към Oracle от Sqoop

  5. Поведение на Oracle rownum с mod функция