コンテンツにスキップ

再帰クエリ

出典: フリー百科事典『ウィキペディア(Wikipedia)』

再帰クエリ (: recursive query) もしくは 階層クエリ (: hierarchical query) は、再帰的な問い合わせを行う SELECT ステートメントである。階層構造を持つデータなどに使う。

WITH RECURSIVE

[編集]

標準SQLでは再帰クエリを共通表式の一環として定義している。WITH RECURSIVE 形式の構文をサポートする関係データベース管理システムを以下に挙げる。通常RECURSIVE句は省略可能であるが、PostgreSQLでは省略できない。:

例 (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;

CONNECT BY

[編集]

非標準の構文として CONNECT BY 形式の構文をサポートするデータベースを以下に挙げる:

構文:

SELECT select_list
FROM table_expression
[ WHERE ... ]
[ START WITH start_expression ]
CONNECT BY { PRIOR parent_expr = child_expr | child_expr = PRIOR parent_expr }
[ ORDER SIBLINGS BY column1 [ ASC | DESC ] [, column2 [ ASC | DESC ] ] ... ]
[ GROUP BY ... ]
[ HAVING ... ]
...

例 (Oracle Database):

 SELECT LEVEL, LPAD (' ', 2 * (LEVEL - 1)) || ename employee, empno, mgr
 FROM emp START WITH mgr IS NULL
 CONNECT BY PRIOR empno = mgr;

上記のクエリからは以下のような結果が得られる:

 level |  employee   | empno | mgr
-------+-------------+-------+------
     1 | KING        |  7839 |
     2 |   JONES     |  7566 | 7839
     3 |     SCOTT   |  7788 | 7566
     4 |       ADAMS |  7876 | 7788
     3 |     FORD    |  7902 | 7566
     4 |       SMITH |  7369 | 7902
     2 |   BLAKE     |  7698 | 7839
     3 |     ALLEN   |  7499 | 7698
     3 |     WARD    |  7521 | 7698
     3 |     MARTIN  |  7654 | 7698
     3 |     TURNER  |  7844 | 7698
     3 |     JAMES   |  7900 | 7698
     2 |   CLARK     |  7782 | 7839
     3 |     MILLER  |  7934 | 7782
(14 rows)

関連項目

[編集]

脚注

[編集]
  1. ^ common-table-expression”. DB2 Version 9.1 for z/OS. 2009年9月10日閲覧。
  2. ^ WITH common_table_expression (Transact-SQL)”. SQL Server 2008. 2009年9月10日閲覧。
  3. ^ Helen Borrie (2008年7月15日). “Firebird 2.1 Release Notes”. 2009年9月10日閲覧。
  4. ^ WITH問い合わせ”. PostgreSQL 文書. 2009年9月10日閲覧。
  5. ^ Oracle Database 11g Release 2に関する10の重要なこと – askTom Live - Point4: Recursive Subquery Factoring 【再帰的副問合せのファクタリング】”. 2010年10月31日閲覧。
  6. ^ Advanced - H2 Database”. 2010年10月31日閲覧。
  7. ^ 階層問合せ”. Oracle Database SQL言語リファレンス 11gリリース2. 2010年10月31日閲覧。
  8. ^ Hierarchical Queries, EnterpriseDB