本文解釋了用於查詢層次數據的SQL遞歸公共表表達式(CTE)。它使用組織圖表示例詳細介紹了他們的結構,並解決了無限遞歸和不正確聯接的常見陷阱。 Opti
遞歸通用表表達式(CTE)是SQL中用於查詢層次數據的強大工具,例如組織圖表,文件系統或材料清單。它們使您可以通過在其定義中反復引用CTE本身來穿越類似樹狀的結構。基本結構涉及錨固成員(初始查詢)和遞歸成員(自我引用部分)。
讓我們用一個名為employees
表中的組織圖表的簡單示例說明:
<code class="sql">CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(255), manager_id INT ); INSERT INTO employees (employee_id, employee_name, manager_id) VALUES (1, 'CEO', NULL), (2, 'VP Sales', 1), (3, 'Sales Rep 1', 2), (4, 'Sales Rep 2', 2), (5, 'VP Marketing', 1), (6, 'Marketing Manager', 5);</code>
為了檢索首席執行官(employee_id 1)下的整個層次結構,我們使用遞歸CTE:
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Selects the CEO SELECT employee_id, employee_name, manager_id, 0 as level FROM employees WHERE employee_id = 1 UNION ALL -- Recursive member: Joins with itself to find subordinates SELECT e.employee_id, e.employee_name, e.manager_id, eh.level 1 FROM employees e INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM EmployeeHierarchy;</code>
該查詢從首席執行官開始,並遞歸增加下屬,直到沒有更多員工向已經包括的員工報告。 level
列指示層次結構中的深度。 UNION ALL
結合了錨和遞歸成員的結果。關鍵是遞歸成員的employees
與EmployeeHierarchy
之間的自我加入,將每個員工與經理聯繫起來。
使用遞歸CTE時,幾個陷阱會導致結果不正確或性能問題:
NULL
)或限制遞歸深度來完成的。UNION ALL
而不是UNION
將包含重複行。如果需要消除重複項,請使用UNION
。但是, UNION ALL
通常都更快。遞歸CTE在非常大的分層數據集上可能會很慢。幾種優化策略可以提高性能:
WHERE
以濾除層次結構的不必要分支。這減少了處理的數據量。遞歸CTE受到大多數主要數據庫系統的支持,但是語法可能會略有不同:
WITH RECURSIVE
使用(儘管RECURSIVE
關鍵字是可選的)。WITH RECURSIVE
用途。START WITH
並通過子句CONNECT BY
,該條款的語法略有不同,但具有相同的功能。雖然核心概念在不同的系統中保持不變,但請始終諮詢特定數據庫系統的文檔,以了解正確的語法和任何特定於系統的限製或優化。請記住要徹底測試您的查詢並介紹其性能以識別和解決瓶頸。
以上是如何在SQL中使用遞歸CTE來查詢分層數據?的詳細內容。更多資訊請關注PHP中文網其他相關文章!