Как показать неиспользуемое значение внешнего ключа при объединении таблиц - PullRequest
2 голосов
/ 06 октября 2011

У меня есть 2 таблицы, emp и dept (сотрудник и отдел). Скажем, я хочу показать сумму всех зарплат по отделу, я мог бы использовать что-то вроде:

select sum(sal), deptno
from emp
group by deptno

Теперь это работает, но, скажем, в списке есть отдел, в котором нет сотрудников, и я хочу, чтобы он также появился, как бы я это сделал? Я пробовал соединения, функция nvl, но пока не повезло. Например, это работает, но не показывает пустые отделы:

select sum(emp.sal), dept.deptno
from emp, dept
where emp.deptno=dept.deptno
group by dept.deptno

Заранее спасибо за любую помощь!

Ответы [ 7 ]

6 голосов
/ 06 октября 2011

LEFT JOIN сделает свое дело:

select coalesce(sum(emp.sal),0), dept.deptno
from dept 
left join emp on emp.deptno=dept.deptno
group by dept.deptno

Вы всегда должны явно объявлять свои объединения, чтобы вы могли изменить их, когда вам нужно.Неявные объединения всегда INNER JOIN.

. Кроме того, я изменяю запрос на показ 0 вместо NULL, когда в отделе нет сотрудников, используя COALESCE.

2 голосов
/ 06 октября 2011

Вы хотите использовать левое соединение, чтобы вернуть все отделы, независимо от того, есть ли у них сотрудники.

SELECT dept.deptno, SUM(emp.sal)
    FROM dept
        LEFT JOIN emp
            ON dept.deptno = emp.deptno
    GROUP BY dept.deptno
2 голосов
/ 06 октября 2011

Вам нужно использовать внешнее соединение

SELECT 
   dept.deptno,
   SUM(emp.sal)
FROM
   dept 
   LEFT OUTER JOIN emp ON dept.deptno = emp.deptno
GROUP BY
   dept.deptno
1 голос
/ 06 октября 2011

Использовать внешнее соединение:

select 
  sum(emp.sal), dept.deptno
from dept LEFT OUTER JOIN emp
  ON dept.deptno=emp.deptno
group by dept.deptno
1 голос
/ 06 октября 2011

Попробуйте это:

 SELECT ISNULL(SUM(e.sal),0) AS SalSum,
        d.DeptNo
 FROM Dept AS d
 LEFT JOIN emp AS e ON e.DeptNo = d.DeptNo
 GROUP BY d.DeptNo
0 голосов
/ 06 октября 2011

Другой альтернативный подход, оправдание которого заключается в том, что он использует реляционные операторы (объединение и различие), упрощающие чтение и понимание, ИМО:

select sum(sal), deptno
from emp
group by deptno

union

select 0, d.deptno
from dept d
minus
select 0, e.deptno
from emp e;
0 голосов
/ 06 октября 2011
select sum(sal), deptno
from emp
group by deptno

union all

select 0, deptno
from dept
where deptno not in (select deptno from emp)

или

select sum(sal), deptno
from emp
group by deptno

union all

select 0, d.deptno
from dept d
where not exists
(
select * 
from emp e
where e.deptno = d.deptno
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...