表與自身連接,需通過**別名**區分同一張表的不同實例。語法:
SELECT ... FROM Table A, Table B WHERE A.col = B.col ...
-- 或標準 JOIN 語法
SELECT ... FROM Table A INNER JOIN Table B ON A.col = B.col ...
數據模型:
Stops(id, name):車站表Route(num, company, pos, stop):線路表(num+company 標識線路,pos 順序,stop 關聯車站)需求:查詢同一線路任意兩站直達關係。
SELECT * FROM Route R1, Route R2
WHERE R1.num = R2.num AND R1.company = R2.company;
語義:R1、R2 代表同一線路的不同站點記錄,結果集包含該線路所有站點對,即任意兩站直達可能性。
需求:找出共用同一車站的所有線路對,支持換乘規劃。
SELECT * FROM Route R1, Route R2
WHERE R1.stop = R2.stop;
結果:每行包含兩條線路在同一站點的記錄,直接映射換乘邊。
需求:從 Craiglockhart 站換乘到 Tollcross 站的線路方案。
SELECT R1.company, R1.num
FROM Route R1
INNER JOIN Route R2 ON R1.num = R2.num AND R1.company = R2.company
INNER JOIN Stops S1 ON R1.stop = S1.id
INNER JOIN Stops S2 ON R2.stop = S2.id
WHERE S1.name = 'Craiglockhart' AND S2.name = 'Tollcross';
邏輯鏈:R1 線路經過起點站 → 同線路 R2 經過終點站 → 即為直達或同線路換乘方案。
| 業務領域 | 表結構 | 自我連接條件 | 語義輸出 |
|---|---|---|---|
| 組織架構 | Employee(id, name, manager_id) | E1.manager_id = E2.id | 員工-直屬主管關係、管理鏈遞歸 |
| 物料清單 (BOM) | Part(id, name, parent_id, qty) | P1.parent_id = P2.id | 父子組件展開、成本滾算 |
| 社交網絡 | Friend(user_id, friend_id) | F1.friend_id = F2.user_id | 好友的好友(二度人脈)、推薦 |
| 時間序列比較 | Sales(date, product, amount) | S1.date = DATEADD(day, -7, S2.date) | 同比/環比計算、趨勢偵測 |
curr/prev、parent/child、src/dst 替代 R1/R2,提升可讀性。WITH RECURSIVE CTE (SQL 2005+),避免多次自我連接膨脹。