この記事では、階層データを照会するためのSQLの再帰的共通テーブル式(CTE)について説明します。組織チャートの例を使用して構造を詳しく説明し、無限の再帰や誤った結合などの一般的な落とし穴に対処します。オプティ
再帰的な一般的なテーブル式(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>
CEO(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>
このクエリはCEOから始まり、従業員が既に含まれている従業員に報告しなくなるまで、部下を再帰的に追加します。 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 中国語 Web サイトの他の関連記事を参照してください。