簡體   English   中英

左外部聯接vs子查詢以包括沒有員工的部門

[英]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

SQLFiddle

請注意,由於我們想要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM