マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

詳細

定義

標準SQL

標準SQLでは再帰クエリを共通表式の一環として定義している。
以下は、WITH RECURSIVE 形式の構文をサポートするRDBMS

  • Microsoft SQL Server
  • Oracle Database 11gR2
  • IBM DB2
  • PostgreSQL 8.4
  • Firebird
  • H2 Database

共通表式

  • WITH問い合わせ(共通テーブル式)
  • 次に続く全選択の FROM 文節で表として指定できる 表 ID を持つ結果表を定義する。

定義例

以下が、再起クエリの定義例(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: :データアクセス


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-30 (火) 13:16:52 (18d)