Self Join 自連接 (SQL Self Join)

Self Join(自連接)是指一個資料表與自己進行 JOIN 操作。當資料表中的某些記錄與同一資料表中的其他記錄有關聯時,就會用到這種技巧。

自連接需要為同一個資料表設定不同的別名(alias),才能區分「左邊的表」和「右邊的表」。

Self Join 語法

SELECT a.column1, b.column2
FROM table_name a, table_name b
WHERE a.column = b.column;

或使用標準 JOIN 語法:

SELECT a.column1, b.column2
FROM table_name a
JOIN table_name b ON a.column = b.column;

範例:查詢員工與主管

假設我們有一個員工資料表 employees,其中 manager_id 欄位儲存的是該員工主管的 employee_id:

employee_idnamemanager_id
1王總經理NULL
2李經理1
3張工程師2
4陳工程師2

使用 Self Join 查詢每位員工及其主管的名字:

SELECT e.name AS 員工, m.name AS 主管
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;

查詢結果:

員工主管
王總經理NULL
李經理王總經理
張工程師李經理
陳工程師李經理

這裡使用 LEFT JOIN 是為了讓沒有主管的員工(如王總經理)也能出現在結果中。

範例:查詢同城市的客戶

假設我們有一個客戶資料表 customers:

customer_idnamecity
1張一台北
2王二台北
3李三高雄

查詢住在同一城市的客戶配對:

SELECT a.name AS 客戶A, b.name AS 客戶B, a.city AS 城市
FROM customers a
JOIN customers b ON a.city = b.city
WHERE a.customer_id < b.customer_id;

查詢結果:

客戶A客戶B城市
張一王二台北

WHERE a.customer_id < b.customer_id 這個條件是為了避免重複配對(張一-王二 和 王二-張一)以及自己配對自己。

常見的 Self Join 使用情境

  1. 階層式資料:員工-主管、分類-父分類
  2. 配對查詢:找出同城市/同部門的記錄
  3. 比較同表資料:找出價格相同的不同商品