2015-01-20 3 views
0

Допустим, у меня есть следующие модели базы данных:левое внешнее объединение против подзапроса включать отделы, без сотрудников

enter image description here

И вопрос заключается в следующем:

Список всех имен отделов и общее количество сотрудников в отделе. Общее число столбцов должно быть переименовано в «total_emps». Закажите список из отдела с наименьшим количеством сотрудников до максимального числа сотрудников. Примечание. Вам необходимо включить в список отдел, даже если в отделе нет назначенного ему сотрудника.

Это была моя попытка:

SELECT Department.deptname 

    (SELECT COUNT(*) 
    FROM Department 
    WHERE Department.empno = Employee.empno) AS total_emps 

FROM Department 

Я уверен, что мое решение не является правильным, поскольку она не будет включать в себя отделы без каких-либо сотрудников. Как вы используете левое внутреннее соединение для решения этой проблемы?

+0

Там нет такого понятия, как "левых внутреннее соединение", это либо [внутреннее] соединение, либо левое [внешнее] соединение. Почему вы хотите только внешнее соединение? – jarlh

ответ

1

Прежде всего, это левый внешний присоединиться. Теперь, для вашего запроса, вы хотите присоединиться к 2 таблицам на основе deptno, а затем также по группе deptno (или deptname, так как это может быть уникальным), чтобы гарантировать, что любая совокупность, которую мы делаем, выполняется для каждого уникального отдела в Таблица. Наконец, подсчет производится с помощью функции count, что приводит к этому запросу:

select d.deptname, count(e.empno) as total_emps 
from department d 
left join employee e on d.deptno = e.deptno 
group by d.deptname 

SQLFiddle

Обратите внимание, что, поскольку мы хотим, чтобы все записи из department независимо от того, есть ли соответствующие записи в employee или нет, department должен появиться в левой части соединения. Мы могли бы сделать то же самое, используя правое внешнее соединение, заменив позиции двух таблиц в соединении.

1

Запрос, как вы пытаетесь написать это:
(таблица создает редактировался sqlfiddle shree.pat18 «s к этому sqlfiddle)

create table department (deptno int, deptname varchar(20)); 
insert into department values (1, 'a'),(2, 'b'),(3, 'c'); 
create table employee (empno int, deptno int); 
insert into employee values (1,1),(2,1),(3,3); 

SELECT d.deptname, 
    (SELECT COUNT(*) 
    FROM EMPLOYEE e 
    WHERE d.deptno = e.deptno) AS total_emps 
FROM DEPARTMENT d 
ORDER BY total_emps ASC; 

(Вы рассчитывали из DEPARTMENT вместо EMPLOYEE и сравнения empno вместо из deptno. И вы не указали запятую.)

(Вас попросили рассчитать имя и число сотрудников каждого отдела, чтобы это получилось. На практике мы будем включать презумуму Блайте уникальный deptno если deptname не было уникально.)

Я уверен, что мое решение не является правильным, поскольку она не будет включать в себя отделов без каких-либо сотрудников.

Даже версия запроса вашего ответа (с отсутствующей запятой) имеет внешний выбор, который возвращает количество для каждого отдела независимо от того, что возвращает подзапрос. Поэтому я не знаю, почему/как вы думали, что это не так.

Если вы хотите использовать LEFT (OUTER) JOIN, то строки DEPARTMENT без сотрудников продлятся NULL. Но COUNT столбца учитывает только строки, отличные от NULL.

SELECT d.deptname, COUNT(e.empno) AS total_emps 
FROM DEPARTMENT d 
LEFT JOIN EMPLOYEE e 
ON d.deptno = e.deptno 
GROUP BY d.deptno 
ORDER BY total_emps ASC; 

(Н.Б. LEFT JOIN версии использует больше понятий: левое соединение уходящей NULL, GROUP BY и значение NULL поведения COUNT для не- *.)

+0

Не должно быть DESC где-то, так как мы заказываем наименьшее количество сотрудников? – martinap

+0

Можете ли вы обновить свой ответ, используя внешнее левое соединение? – martinap

+0

Добавлен заказ для привет. Почему левая версия присоединения? – philipxy