#sql #oracle
Вопрос:
1 select Department.department_name, count(Staff.staff_id) as counter
2 from Department right join Staff on Department.department_id = Staff.department_id
3 group by department_name
4 order by department_name;
Приведенный выше код дает мне
DEPARTMENT_NAME COUNTER
------------------------------ ----------
CSE 2
ECE 1
EEE 2
IT 2
SE 4
Но мне просто нужно показать отдел, который имеет максимальное значение, не показывая значение, подобное этому,
DEPARTMENT_NAME
------------------------------
SE
Вот схема для справки.
Ответ №1:
В стандартном SQL вы бы использовали order by
и ограничили одну строку:
select s.department_name
from Department d join
Staff s
on d.department_id = s.department_id
group by d.department_name
order by count(*) desc
fetch first 1 row only;
Примечания:
- Это работает в Oracle. В MySQL используйте
limit 1
вместо этого. - Псевдонимы таблиц облегчают запись и чтение запроса.
- Достаточно внутреннего соединения. Вам не нужны отделы без совпадений.
Редактировать:
В более старых, неподдерживаемых версиях Oracle вы можете использовать:
select d.*
from (select s.department_name
from Department d join
Staff s
on d.department_id = s.department_id
group by d.department_name
order by count(*) desc
) d
where rownum = 1;
Комментарии:
1. извлеките только первую 1 строку; не работает. Ошибка ORA 00933: неправильно завершена команда SQL.
2. @AbhishekMazumder . . .
fetch
доступен во всех поддерживаемых версиях Oracle. Какую версию вы используете?3. Я пробовал использовать rownum и получил тот же результат, но тестовые примеры все еще не очищены, я думаю, что платформа(которую я использую) не позволяет использовать rownum.
4. @AbhishekMazumder — поэтому для вашего ora-00933 нам нужно будет увидеть ваше фактическое, полное и точное заявление. Вы не можете отлаживать код, который вы не видите, и никто другой не может.