如何在连接表时显示未使用的外键值

时间:2011-10-05 20:05:44

标签: sql oracle

我有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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

您需要使用外部联接

SELECT 
   dept.deptno,
   SUM(emp.sal)
FROM
   dept 
   LEFT OUTER JOIN emp ON dept.deptno = emp.deptno
GROUP BY
   dept.deptno

答案 2 :(得分:2)

您希望使用LEFT JOIN,以便返回所有部门,无论他们是否有员工。

SELECT dept.deptno, SUM(emp.sal)
    FROM dept
        LEFT JOIN emp
            ON dept.deptno = emp.deptno
    GROUP BY dept.deptno

答案 3 :(得分:1)

试试这个:

 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

答案 4 :(得分:1)

使用外部联接:

select 
  sum(emp.sal), dept.deptno
from dept LEFT OUTER JOIN emp
  ON dept.deptno=emp.deptno
group by dept.deptno

答案 5 :(得分:0)

另一种替代方法,理由是它使用关系运算符(联合和差异)使其易于阅读和理解,IMO:

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;

答案 6 :(得分:-1)

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
)