「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>SQL]] * 目次 [#e649080b] #contents *概要 [#r0892ffe] SQLは非手続き言語のため、手続き的に解り難いことが多いが、~ 再起クエリはより解り難いので、再帰クエリがどういう仕組みで動くか分析してみた。 ※ [[DNSの再帰クエリ>]]ではなく。 ※ ココでは、[[DNSの再帰クエリ>DNSサーバ#a04f4c5b]]ではなく。 *詳細 [#v339b0d2] **定義 [#deeb247c] ***標準SQL [#m076b9e0] 標準SQLでは再帰クエリを[[共通表式>#ua7639e5]]の一環として定義している。~ 以下は、WITH RECURSIVE 形式の構文をサポートするRDBMS -Microsoft SQL Server -Oracle Database 11gR2 -IBM DB2 -PostgreSQL 8.4 -Firebird -H2 Database ***共通表式 [#ua7639e5] -WITH問い合わせ(共通テーブル式) -次に続く全選択の FROM 文節で表として指定できる 表 ID を持つ結果表を定義する。 ***定義例 [#se32dead] 以下が、再起クエリの定義例(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; **分析 [#f6b8a4d4] ***ルートのクエリ [#d393eda7] 以下の部分がルートのクエリ SELECT 1, ename, empno, mgr FROM emp WHERE mgr IS NULL ***ワークのレコード [#r792bf4d] 以下の部分で、 WITH RECURSIVE r(level, employee, empno, mgr) AS ( 下記で取得した結果セットを[[再帰のクエリ>#mecf59f8]]に渡すレコードに加工 -[[ルートのクエリ>#d393eda7]] -[[再帰のクエリ>#mecf59f8]] ***再帰のクエリ [#mecf59f8] ここで、テーブルを[[ワークの親レコード>#r792bf4d]](=[[共通表式>#ua7639e5]])とJOINする。 SELECT r.level + 1, repeat(' ', r.level) || emp.ename, emp.empno, emp.mgr FROM emp, r WHERE emp.mgr = r.empno この結果セットは、再び、「[[再帰のロジックに渡すレコード>#r792bf4d]]」に加工される。 ***結果テーブル([[共通表式>#ua7639e5]]) [#j9998f33] 下記をUnionしたものが[[共通表式>#ua7639e5]]として利用可能。 -[[ルートのクエリ>#d393eda7]]の結果セット -[[再帰のクエリ>#mecf59f8]]の結果セット 再帰の度に、[[再帰のクエリ>#mecf59f8]]の結果セットがUnionで積み上がっていくイメージ。 ***[[結果テーブル>#j9998f33]]のSELECT [#f816bfcb] [[結果テーブル>#j9998f33]]([[共通表式>#ua7639e5]])をSELECTして、射影や集計を行う。 *参考 [#l72866e7] -再帰クエリ - Wikipedia~ https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E3%82%AF%E3%82%A8%E3%83%AA -再帰SQL -図解- - Qiita~ https://qiita.com/Shoyu_N/items/f1786f99545fa5053b75 ---- Tags: [[:データアクセス]]