我有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
提前感谢您的帮助!
答案 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
)