首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle CONNECT BY 層次查詢語法詳解:PRIOR 位置決定遍歷方向、START WITH 多根節點、ORDER SIBLINGS BY 同級排序

     編輯:Oracle 資料庫基礎

前言

CONNECT BY 是 Oracle 專有的層次查詢語法,廣泛用於組織架構、物料 BOM、菜單樹等樹形數據處理。本文系統講解完整語法結構、PRIOR 運算符位置語義、START WITH 根節點定義、ORDER SIBLINGS BY 同級排序、LEVEL/SYS_CONNECT_BY_PATH/CONNECT_BY_ISLEAF 偽列,並給出正反向遍歷對比示例。

標準語法結構


SELECT column_list
FROM table_name
[WHERE filter_condition]
[START WITH root_condition]
CONNECT BY [NOCYCLE] PRIOR parent_col = child_col
[ORDER SIBLINGS BY sort_col];

核心子句解析

子句作用關鍵點
START WITH定義根節點集合可省略 (全表為根);支持子查詢 START WITH id IN (SELECT ...)
CONNECT BY定義父子關系PRIOR 必須放在等式一側:
PRIOR parent = child = 父→子 (正向)
PRIOR child = parent = 子→父 (反向)
PRIOR指示「上一輪」的列只能用於 CONNECT BY 條件中,不可用於 SELECT/WHERE
NOCYCLE檢測並忽略循環10g+ 支持,配合 CONNECT_BY_ISCYCLE 偽列識別循環節點
ORDER SIBLINGS BY同級節點排序不影響層次結構,僅調整同父節點下的輸出順序

偽列應用

偽列類型含義
LEVELNUMBER根節點為 1,每層遞增
SYS_CONNECT_BY_PATH(col, sep)VARCHAR2從根到當前節點的路徑拼接
CONNECT_BY_ISLEAFNUMBER1=葉子節點,0=非葉子
CONNECT_BY_ISCYCLENUMBER1=發現循環 (需 NOCYCLE),0=無循環

完整示例:正向遍歷 (父→子)


SELECT pid, id, name
FROM t_wf_eng_wfkind
START WITH pid = 0
CONNECT BY PRIOR id = pid
ORDER SIBLINGS BY name;

反向遍歷 (子→父) 差異對比


-- 正向:根→葉
CONNECT BY PRIOR id = pid

-- 反向:葉→根
CONNECT BY PRIOR pid = id

-- 區別在於 PRIOR 放在等式左邊 (父) 還是右邊 (子),以及 START WITH 指定根或葉

實戰場景:給定節點集合收集所有祖先


SELECT pid, id, name
FROM v_wf_wfkind_tree
WHERE id IN (
  SELECT DISTINCT id
  FROM v_wf_wfkind_tree
  START WITH id IN ('0','01','0101','0203','0304')
  CONNECT BY PRIOR pid = id
);

內層反向遞歸收集祖先鏈路,外層去重並查詢詳情。

遷移建議:ANSI 標準遞歸 CTE (11g+)


WITH RECURSIVE tree_path (id, name, pid, lvl, path) AS (
  SELECT id, name, pid, 1, CAST(name AS VARCHAR2(4000))
  FROM tbl_test WHERE pid = 0
  UNION ALL
  SELECT t.id, t.name, t.pid, tp.lvl + 1, tp.path || '>' || t.name
  FROM tbl_test t JOIN tree_path tp ON t.pid = tp.id
)
SELECT * FROM tree_path;

跨數據庫兼容性更好,邏輯更直觀,建議新項目採用。

總結

掌握 START WITH 定根、CONNECT BY PRIOR 定向 (父左子右 vs 子左父右)、NOCYCLE 防循環、偽列輔助分析、ORDER SIBLINGS BY 同級排序,即可駕馭 Oracle 層次查詢。理解 PRIOR 位置語義是正反向遍歷的關鍵分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved