「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
SQLは非手続き言語のため、手続き的に解り難いことが多いが、
再起クエリはより解り難いので、再帰クエリがどういう仕組みで動くか分析してみた。
標準SQLでは再帰クエリを共通表式の一環として定義している。
以下は、WITH RECURSIVE 形式の構文をサポートするRDBMS
以下が、再起クエリの定義例(PostgreSQL)
WITH RECURSIVE r(level, employee, empno, mgr) AS ( SELECT 1, ename, empno, mgr FROM emp WHERE mgr IS NULL UNION ALL SELECT r.level + 1, repeat(' ', r.level) || emp.ename, emp.empno, emp.mgr FROM emp, r WHERE emp.mgr = r.empno ) SELECT * FROM r;
以下の部分がルートのクエリ
SELECT 1, ename, empno, mgr FROM emp WHERE mgr IS NULL
以下の部分で、
WITH RECURSIVE r(level, employee, empno, mgr) AS (
下記で取得した結果セットを再帰のクエリに渡すレコードに加工
ここで、テーブルをワークの親レコード(=共通表式)とJOINする。
SELECT r.level + 1, repeat(' ', r.level) || emp.ename, emp.empno, emp.mgr FROM emp, r WHERE emp.mgr = r.empno
この結果セットは、再び、「再帰のロジックに渡すレコード」に加工される。
下記をUnionしたものが共通表式として利用可能。
再帰の度に、再帰のクエリの結果セットがUnionで積み上がっていくイメージ。
結果テーブル(共通表式)をSELECTして、射影や集計を行う。
Tags: :データアクセス