Intereting Posts
Сохранение пользовательских настроек в веб-приложении Когда мы можем использовать номер идентификатора вместо его имени в PostgreSQL? Использование критериев и прогнозов Hibernate для выбора нескольких отдельных столбцов Создание недетерминированных функций в SQL Server с использованием RAND () Условие условного WHERE с оператором CASE в Oracle MySQL выбирает запись с последней датой выберите отдельный счетчик (id) vs select count (отдельный идентификатор) iDB2 Выберите команду с параметрами, возвращающими SQL0418 SQL Query: сложные внутренние соединения и внешние соединения Как весна JdbcTemplate распознает типы данных? Возможно ли подсчет по разным условиям в одном запросе? SQL-запрос с и без mysql выбрать контент вокруг ключевого слова Вставлять строки (родительские и дочерние элементы) программно PostgreSQL – запрос из сценария bash как пользователь базы данных postgres '

Функция SQL group слишком сложна

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

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

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

     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 

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