自連接 是查詢同一張表內部關聯關係 (如員工-主管、站點-路線) 的關鍵技巧。本文透過公車路網實例,詳細說明自連接語法、別名機制、多種連接條件語意差異與換乘查詢進階應用。
自連接時,同一張表在查詢中出現多次,必須給予不同別名以區分實體:
FROM route R1, route R2 -- R1、R2 為 route 表的兩個實體別名
WHERE R1.num = R2.num -- 透過別名.欄位 參考對應實體欄位
stops(id, name):車站表route(num, company, pos, stop):路線表 (num=路線號, company=業者, pos=順序, stop=站點ID)SELECT * FROM route R1, route R2
WHERE R1.num = R2.num
AND R1.company = R2.company;
語意:找出同一業者、同一路線號的所有站點組合,可推導任兩站直達可行性。
SELECT * FROM route R1, route R2
WHERE R1.stop = R2.stop;
語意:找出停靠相同站點的所有路線組合,是換乘分析基礎。
SELECT R1.company, R1.num
FROM route R1, route R2, stops S1, stops S2
WHERE R1.num = R2.num
AND R1.company = R2.company
AND R1.stop = S1.id
AND R2.stop = S2.id
AND S1.name = 'Craiglockhart'
AND S2.name = 'Tollcross';
語意:查詢從 Craiglockhart 到 Tollcross 可直達的路線 (同路線號、同業者)。若需換乘,再增加中轉站條件。
| 模式 | 連接條件 | 典型應用場景 |
|---|---|---|
| 同群組內關聯 | R1.group_key = R2.group_key | 同部門員工、同訂單明細、同路線站點 |
| 父子層級關聯 | R1.parent_id = R2.id | 員工-主管、分類樹、BOM 結構 |
| 共用屬性關聯 | R1.attr = R2.attr | 共用站點換乘、共用標籤推薦 |
| 時間序列對比 | R1.date = R2.date + 1 | 同比/環比、連續登入天數 |
FROM route R1 JOIN route R2 ON R1.num = R2.num,可讀性更佳route(num, company)、route(stop)) 顯著提升效能CONNECT BY (Oracle 階層查詢) 或遞迴 CTE (11gR2+)掌握自連接別名邏輯,能靈活表達同一實體集合內部的豐富關聯語意。