組織機構表包含code(編碼)、parent(父節點)、level(層級)三字段,數據呈樹狀結構。需求:查詢所有層級為「縣/區」的記錄,輸出其對應的省級、國家級編碼,形成三列扁平化結果。
| code | parent | level |
|---|---|---|
| 中國 | 0 | 國家 |
| 浙江省 | 中國 | 省 |
| 江蘇省 | 中國 | 省 |
| 杭州市 | 浙江省 | 市 |
| 南京市 | 江蘇省 | 市 |
| 西湖區 | 杭州市 | 縣/區 |
| 玄武區 | 南京市 | 縣/區 |
| code1(縣/區) | code2(省) | code3(國家) |
|---|---|---|
| 西湖區 | 浙江省 | 中國 |
| 玄武區 | 江蘇省 | 中國 |
SELECT
one.code AS code1,
two.parent AS code2,
'中國' AS code3
FROM city one
INNER JOIN city two ON one.parent = two.code
WHERE one.level LIKE '%縣%';
one(子節點)和two(父節點)one.parent = two.code建立父子關係one.level LIKE '%縣%'定位最底層節點two.parent直接獲取父節點的父節點(即省級的父節點為國家)若層級不固定或需動態深度,標準SQL遞歸CTE更通用:
WITH RECURSIVE org_tree AS (
SELECT code, parent, level, 1 AS depth, code AS root_code
FROM city WHERE parent = '0'
UNION ALL
SELECT c.code, c.parent, c.level, ot.depth + 1, ot.root_code
FROM city c JOIN org_tree ot ON c.parent = ot.code
)
SELECT
leaf.code AS code1,
parent.code AS code2,
root.code AS code3
FROM org_tree leaf
JOIN org_tree parent ON leaf.parent = parent.code
JOIN org_tree root ON parent.parent = root.code
WHERE leaf.level LIKE '%縣%';
parent、code建立索引level = '縣/區'精確匹配而非模糊查詢固定三層結構用自連接最簡潔高效;不定深度樹形結構需遞歸CTE。理解表自連接是掌握SQL樹形查詢的關鍵一步。