「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>SQL]]

* 目次 [#e649080b]
#contents

*概要 [#r0892ffe]
SQLは非手続き言語のため、手続き的に解り難いことが多いが、~
再起クエリはより解り難いので、再帰クエリがどういう仕組みで動くか分析してみた。

*詳細 [#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: [[:データアクセス]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS