- 追加された行はこの色です。
- 削除された行はこの色です。
「[[マイクロソフト系技術情報 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: [[:データアクセス]]