SQL 聯集語法 每一位員工的主要歸屬部門 Leetcode #1789

閱讀時間約 5 分鐘


題目敘述

題目會給我們一張Employee 資料表。裡面分別有employee_id、department_id 、primary_flag 等欄位。其中(employee_id, department_id) 是這張資料表的複合主鍵Primary key。


要求我們列出每一位員工的主要歸屬部門ID

主要歸屬部門ID定義:

當一位員工只有一個department_id時,那個部門就是主要歸屬部門。

當一位員工擁有多個department_id時,primary_flag標記為"Y"的那個部門就是主要歸屬部門。

輸出答案時,順序不拘


Table: Employee

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| department_id | int |
| primary_flag | varchar |
+---------------+---------+
(employee_id, department_id) is the primary key (combination of columns with unique values) for this table.
employee_id is the id of the employee.
department_id is the id of the department to which the employee belongs.
primary_flag is an ENUM (category) of type ('Y', 'N'). If the flag is 'Y', the department is the primary department for the employee. If the flag is 'N', the department is not the primary.

詳細的題目可在這裡看到


約束條件

主要歸屬部門ID定義:

  1. 當一位員工擁有多個department_id時,primary_flag標記為"Y"的那個部門就是主要歸屬部門。
  2. 當一位員工只有一個department_id時,那個部門就是主要歸屬部門。

輸出答案時,順序不拘


演算法- 聯集UNION操作

這題的考點主要在於把題目中的主要部門的OR運算,轉成等價的SQL查詢語法 UNION

如果還不熟SQL聯及操作的讀者,請參考UNION 語法的教學。


條件1. 當一位員工只有一個department_id時,那個部門就是主要歸屬部門。

條件2. 當一位員工擁有多個department_id時,primary_flag標記為"Y"的那個部門就是主要歸屬部門。


思考與解題邏輯如下:

當滿足條件1 條件2,則該部門為主要歸屬部門。

<=> 當滿足條件1 OR 條件2,則該部門為主要歸屬部門。

<=> 滿足條件1的SQL查詢結果 聯集 滿足條件2的SQL查詢結果。

<=> 滿足條件1的SQL查詢結果 UNION 滿足條件2的SQL查詢結果。

<=>

#滿足條件1的SQL查詢結果

SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = "Y"

#聯集
UNION

#滿足條件2的SQL查詢結果
SELECT employee_id, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1;



程式碼- 聯集UNION操作

# For employee who has multiple department labels
SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = "Y"
UNION
# For employee who has only one department label
SELECT employee_id, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1;

關鍵知識點

當原本的要求 滿足條件1 OR 滿足條件2 很難在一次SQL內寫完時,可以先拆解,再取對應等價的邏輯操作。

因為這題是 OR,對應到的SQL查詢結果合併的語法就是UNION取聯集


Reference:

[1] MySQL with ...table 1 UNION ...table 2 [w/ Comment] - Primary Department for Each Employee - LeetCode

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!