2013-05-15 1 views
0

Я пытаюсь создать запрос sql, который вернет наименьшее появление идентификатора, появляющегося между двумя таблицами, однако я продолжаю получать ошибку с линией HAVING MIN(COUNT(E.C_SE_ID)). Oracle говорит, что группа по функции вложен слишком глубоко. я не могу придумать другой способ возвращения C_SE_IDФункция SQL group слишком глубоко вложена

SELECT CS.C_SE_ID, MIN(COUNT(E.C_SE_ID)) 
FROM COURSE_SECTION CS, ENROLLMENT E, LOCATION L 
WHERE CS.C_SE_ID=E.C_SE_ID 
AND CS.LOC_ID=L.LOC_ID 
AND L.BLDG_CODE='DBW' 
GROUP BY CS.C_SE_ID 
HAVING MIN(COUNT(E.C_SE_ID)); 

в регистрации таблице s_id и c_se_id связаны, я пытаюсь получить все s_id, которые связаны с этой c_se_id. с обновленным оракулом запроса не нравится select * (по понятным причинам), но когда я тоже его меняю e.c_Se_id Я ничего не получаю.

SELECT E.S_ID 
FROM COURSE_SECTION CS, ENROLLMENT E 
WHERE CS.C_SE_ID=E.C_SE_ID 
AND E.C_SE_ID =(
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); 

ответ

2

Один из способов сделать это путем вложения ваш запрос, а затем выбрать первую строку на выходе:

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. Эта таблица, похоже, не используется (если только для фильтрации результатов), а удаление ее подразумевает запросы.

+0

Есть три значения, которые должны быть возвращены, но это только возвращает 1 значение? – user1393064

+0

жаль беспокоить вас, но это используется во вложенном подзапросе и его ошибках бросания, так как * возвращает слишком много значений. Я обновлю вопрос со всей необходимой информацией – user1393064