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_id | name | manager_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_id | name | city |
|---|---|---|
| 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 使用情境
- 階層式資料:員工-主管、分類-父分類
- 配對查詢:找出同城市/同部門的記錄
- 比較同表資料:找出價格相同的不同商品