題目會給我們一張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定義:
輸出答案時,順序不拘。
這題的考點主要在於把題目中的主要部門的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;
# 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: