↓快轉到主要內容
  1. LeetCode/

LeetCode 181: Employees Earning More Than Their Managers

·1 分鐘· ·
LeetCode Easy Database
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2021-10-09

  • 提交紀錄:Runtime Error → Wrong Answer ×2 → Accepted → Wrong Answer → Accepted

解題思路
#

同一張表要扮演「員工」和「主管」兩個角色,所以 self join(SQL 模板三):e.managerId = m.id 把每個員工接到他的主管,再用 e.salary > m.salary 過濾。輸出欄位要命名成 Employee。沒有主管的人 managerId 是 NULL,join 不到,自然不會出現。

我的嘗試
#

這題提交了 6 次:

  • 第一版 SELECT Name 沒寫是哪一個別名的欄位,兩個別名都有 Name,有歧義(RE)。
  • 改成 A.Name 之後,輸出的欄位名稱不是 Employee;中間有一版改成 SELECT * 想看資料。最後寫成 a.Name AS 'Employee' 才 AC。

正確解法
#

SELECT e.name AS Employee
FROM Employee e
JOIN Employee m ON e.managerId = m.id
WHERE e.salary > m.salary;

複雜度
#

self join,有索引時接近 O(n)。

要特別避免的錯誤
#

  • 兩個別名都要寫清楚欄位屬於哪一個,Name 單獨寫會有歧義。
  • 輸出的欄位名稱要是 Employee。
  • SQL 的別名在 MySQL 預設不分大小寫,但最好保持一致。

面試口說整理
#

同一張表要當員工和主管兩個角色,所以我用 self join,用員工的 managerId 接到主管的 id,再留下薪水比主管高的員工,欄位命名成 Employee。

相關文章

LeetCode 175: Combine Two Tables
·1 分鐘
LeetCode Easy Database
LeetCode 175 解題筆記:沒有地址的人也要出現,所以用 LEFT JOIN,對不到的 city、state 會是 NULL
LeetCode 182: Duplicate Emails
·1 分鐘
LeetCode Easy Database
LeetCode 182 解題筆記:按 email 分組,HAVING COUNT(*) > 1 留下出現超過一次的
LeetCode 183: Customers Who Never Order
·1 分鐘
LeetCode Easy Database
LeetCode 183 解題筆記:LEFT JOIN Orders,對不到訂單(o.id IS NULL)的就是從來沒下過單的客戶;也可以用 NOT IN
LeetCode 196: Delete Duplicate Emails
·1 分鐘
LeetCode Easy Database
LeetCode 196 解題筆記:要用 DELETE 而不是 SELECT;每個 email 只保留最小的 id,其他刪掉
LeetCode 26: Remove Duplicates from Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 26 解題筆記:快慢指針原地覆寫,慢指針指向下一個要寫的位置;遇到跟前一個寫入的值不同才寫
LeetCode 14: Longest Common Prefix
·1 分鐘
LeetCode Easy Array String Trie
LeetCode 14 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度