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

LeetCode 183: Customers Who Never Order

·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

  • 提交紀錄:Accepted(一次通過)

解題思路
#

找「在另一張表沒有出現」的列(SQL 模板三):Customers LEFT JOIN Orders,對不到的訂單欄位是 NULL,用 o.id IS NULL 篩出來。NOT IN (SELECT customerId FROM Orders) 也可以,但子查詢裡如果有 NULL,NOT IN 會變成一筆都不回傳(SQL 模板二),LEFT JOIN ... IS NULL 或 NOT EXISTS 比較安全。

我的嘗試
#

一次 AC,當時用的是 NOT IN (SELECT CustomerId FROM Orders)。

正確解法
#

SELECT c.name AS Customers
FROM Customers c
LEFT JOIN Orders o ON c.id = o.customerId
WHERE o.id IS NULL;

複雜度
#

有索引時接近 O(n + m)。

要特別避免的錯誤
#

  • 判斷 NULL 要用 IS NULL,不能用 = NULL。
  • NOT IN 遇到子查詢有 NULL 會出錯。

面試口說整理
#

我用 Customers LEFT JOIN Orders,對不到訂單的客戶訂單欄位會是 NULL,用 IS NULL 篩出來就是從來沒下過單的人。用 NOT IN 也可以,但子查詢有 NULL 時會出問題。

相關文章

LeetCode 175: Combine Two Tables
·1 分鐘
LeetCode Easy Database
LeetCode 175 解題筆記:沒有地址的人也要出現,所以用 LEFT JOIN,對不到的 city、state 會是 NULL
LeetCode 181: Employees Earning More Than Their Managers
·1 分鐘
LeetCode Easy Database
LeetCode 181 解題筆記:Employee 跟自己 self join,用 managerId = id 把員工和主管接起來,再比較薪水
LeetCode 182: Duplicate Emails
·1 分鐘
LeetCode Easy Database
LeetCode 182 解題筆記:按 email 分組,HAVING COUNT(*) > 1 留下出現超過一次的
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 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度