Вы пытаетесь найти идентификатор отдела, который соответствует количеству сотрудников;а не отдел, к которому принадлежат эти сотрудники.
Если у вас 12c или выше, вы можете использовать условие ограничения строк:
select d.department_id, d.department_name, count(e.employee_id) as employee_count
from departments d
join employees e on e.department_id = d.department_id
group by d.department_id, d.department_name
order by count(e.employee_id) desc
fetch first row only;
DEPARTMENT_ID DEPARTMENT_NAME EMPLOYEE_COUNT
------------- ------------------------------ --------------
50 Shipping 45
Если вы можете иметь связи и хотите показать все связанныестроки измените only
на with ties
;в противном случае вы получите неопределенный ряд из тех, которые связаны.
В более ранних версиях эквивалент будет:
select department_id, department_name, employee_count
from (
select d.department_id, d.department_name, count(e.employee_id) as employee_count
from departments d
join employees e on e.department_id = d.department_id
group by d.department_id, d.department_name
order by count(e.employee_id) desc
)
where rownum = 1;
DEPARTMENT_ID DEPARTMENT_NAME EMPLOYEE_COUNT
------------- ------------------------------ --------------
50 Shipping 45
, который также не определен, если есть связи.
Для правильной обработки связей до 12c, вы можете использовать запрос, похожий на @ Littlefoot, но с использованием rank()
:
select department_id, department_name, employee_count
from (
select d.department_id, d.department_name, count(e.employee_id) as employee_count,
rank() over (order by count(*) desc) as rnk
from departments d
join employees e on e.department_id = d.department_id
group by d.department_id, d.department_name
order by count(e.employee_id) desc
)
where rnk = 1;
... или использовать подход @ TheImpaler.
учитель хочет только подзапрос
Всегда весело иметь артикулярные ограничения ... но вы можете сделать:
select d.department_id, d.department_name, count(e.employee_id) as employee_count
from departments d
join employees e on e.department_id = d.department_id
group by d.department_id, d.department_name
having count(e.employee_id) = (
select max(count(employee_id))
from employees
group by department_id
);
, который покажет связи;или
select d.department_id, d.department_name, count(e.employee_id) as employee_count
from departments d
join employees e on e.department_id = d.department_id
where d.department_id in (
select department_id
from (
select department_id
from employees
group by department_id
order by count(employee_id) desc
)
where rownum = 1
)
group by d.department_id, d.department_name;
, что не произойдет, если вы не измените rownum
на rank()
снова.
явных объединений нет, если это возможно
Если вам не разрешено любое присоединение, я полагаю, вы могли бы сделать:
select d.department_id, d.department_name,
(select count(e.employee_id)
from employees e
where e.department_id = d.department_id) as employee_count
from departments d
where d.department_id in (
select department_id
from (
select department_id
from employees
group by department_id
order by count(employee_id) desc
)
where rownum = 1
)
group by d.department_id, d.department_name;
DEPARTMENT_ID DEPARTMENT_NAME EMPLOYEE_COUNT
------------- ------------------------------ --------------
50 Shipping 45
, что немного смешно * 8 -)