「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。 目次 †概要 †SQLは非手続き言語のため、手続き的に解り難いことが多いが、 ※ ココでは、DNSの再帰クエリではなく。 詳細 †定義 †標準SQL †標準SQLでは再帰クエリを共通表式の一環として定義している。
共通表式 †
定義例 †以下が、再起クエリの定義例(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 †結果テーブル(共通表式)をSELECTして、射影や集計を行う。 参考 †
Tags: :データアクセス |