Подзапрос SQL не возвращает результатов - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь отобразить количество сотрудников, работающих в отделе с наибольшим количеством сотрудников.Но запрос, который я имею, не возвращает ничего, он не завершается ошибкой, но данные не возвращаются.Я использую разработчика Oracle SQL, но большинство форм SQL должно помочь.

Извините, я должен был указать, но это для класса, и учитель хочет, чтобы только подзапросы НЕ объединялись.

select d.DEPARTMENT_ID, d.DEPARTMENT_NAME, count(e.employee_id)
from departments d, employees e
where d.department_id = (select max(count(employee_id)) from employees group by 
department_id)
group by d.department_id, d.department_name;

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

На основе схемы Скотта:

SQL> with rnk as
  2    (select deptno,
  3            count(*) cnt,
  4            row_number() over (order by count(*) desc) rn
  5     from emp
  6     group by deptno
  7    )
  8  select d.deptno, d.dname, r.cnt
  9  from dept d join rnk r on r.deptno = d.deptno
 10  where r.rn = 1;

    DEPTNO DNAME                 CNT
---------- -------------- ----------
        30 SALES                   6

SQL>

с исходными данными

SQL> select deptno, count(*)
  2  from emp
  3  group by deptno;

    DEPTNO   COUNT(*)
---------- ----------
        30          6
        20          3
        10          3

SQL>
0 голосов
/ 06 декабря 2018

Вы пытаетесь найти идентификатор отдела, который соответствует количеству сотрудников;а не отдел, к которому принадлежат эти сотрудники.

Если у вас 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 -)

0 голосов
/ 06 декабря 2018

Это будет делать:

with
x as (
  select d.department_id, d.department_name, count(*) as tot
  from employees e
  join departments d on d.department_id = e.department_id
  group by d.department_id, d.department_name
),
y as (
  select max(tot) as t from x
)
select x.* from x join y on y.t = x.tot;

Дополнительная функция (по той же цене): если два отдела связаны на первом месте, этот запрос покажет вам оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...