[LeetCode 學習之路] (Easy) 175. Combine Two Tables

Rick Hou
5 min readJan 10, 2024

--

網址: https://leetcode.com/problems/combine-two-tables/description/

前言:挑戰的起點

一開始,在想要選擇什麼類型的題目做為我的這個挑戰的開端,在幾經思考後,我決定選擇自己感到相對陌生的領域─ SQL。雖然大學有修過資料庫的課程,但在後來的工作中主要都依賴ORM(物件關聯映射)工具,使得我對 SQL 這部分掌握的不是很好,甚至連一些不太困難的 SQL 都沒有太大的把握。因此,想藉由這個機會先選一題簡單的 SQL 作為我的第一個挑戰的題目。

解題過程

# 表
Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| personId(PK)| int |
| lastName | varchar |
| firstName | varchar |
+-------------+---------+

Address
+--------------+---------+
| Column Name | Type |
+--------------+---------+
| addressId(PK)| int |
| personId | int |
| city | varchar |
| state | varchar |
+--------------+---------+

# 題目 Input 與預期的 Output
Input:
Person table:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address table:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
Output:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+

一開始先直接動手做了

select per.firstName as “firstName”, per.lastName as “lastName”, add.city as “city”, add.state as “state”
from Address as add
left join Person as per on add.personId = per.personId;

-- Result
-- | firstName | lastName | city | state |
-- | --------- | -------- | ------------- | ---------- |
-- | Bob | Alice | New York City | New York |
-- | null | null | Leetcode | California |

後來才發現,好像放反了,結果長得很奇怪…

select per.firstName as “firstName”, per.lastName as “lastName”, add.city as “city”, add.state as “state”
from Person as per
left join Address as add on add.personId = per.personId;

-- Result
-- | firstName | lastName | city | state |
-- | --------- | -------- | ------------- | -------- |
-- | Allen | Wang | null | null |
-- | Bob | Alice | New York City | New York |

重新看了題目後才發現,要以 Person 為主體去 left join

心得

我覺得這個過程就是我在學習 SQL 的最佳縮影,在看理論的時候總覺得這很簡單,也覺得這個應該不會太困難(?…

相信大家有看過講解 Join 的圖片(https://www.runoob.com/sql/sql-join.html),我看過後也覺得自己一定能輕鬆辦到,但要親自動手寫出來時總會覺得卡卡的,或是像上面一樣,結果與我想的不太相同,事後總會覺得自己怎麼那麼笨,寫出這種東西。到底是哪個表該先,哪個表應該在前,這些判斷看起來應該要簡單,結果看起來好像不是我所想像的這樣。

老實說,這題很簡單,我覺得對很多人來說這個題目就像是一碟小菜一樣輕而易舉。但對我來說,這是一個很好的起頭,也希望自己能在這部分更加熟練

--

--