[英]Left outer join vs subquery to include departments with no employees
可以說我有以下數據庫模型:
問題如下:
列出所有部門名稱和部門中的員工總數。 雇員總數列應重命名為“ total_emps”。 從人數最少的部門到人數最多的部門訂購清單。 注意:即使該部門當前沒有分配任何員工,您也需要在該列表中包括一個部門。
這是我的嘗試:
SELECT Department.deptname
(SELECT COUNT(*)
FROM Department
WHERE Department.empno = Employee.empno ) AS total_emps
FROM Department
我很確定我的解決方案不正確,因為它不包括沒有員工的部門。 您如何使用左內聯接解決此問題?
首先,這是一個左外部聯接。 現在,對於您的查詢,您想要基於deptno
這兩個表,然后還按deptno
分組(或deptname
,因為這很可能是唯一的),以確保我們對每個唯一部門進行匯總表。 最后,使用count
函數完成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
請注意,由於我們想要department
所有記錄,而不管employee
中是否有匹配的記錄,因此department
必須出現在聯接的左側。 通過交換聯接中2個表的位置,我們可以使用右外部聯接完成相同的操作。
您嘗試編寫的查詢是:
(表創建從shree.pat18的sqlfiddle修改為此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
。然后您省略了逗號。)
(系統要求您提供每個部門的名稱和員工人數,以便返回該值。實際上,如果deptname
不是唯一的,我們將包括一個唯一的deptno
。)
我很確定我的解決方案不正確,因為它不包括沒有員工的部門。
甚至您答案的查詢版本(添加了缺少的逗號)都具有外部選擇,無論子選擇返回什么,該外部選擇都會返回每個部門的計數。 所以我不知道您為什么/如何認為不會。
如果要使用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;
(Nb的LEFT JOIN版本使用更多概念:LEFT JOIN擴展為NULL,GROUP BY和COUNT的非*
行為。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.