13章階層クエリ

本章では、データ内で生じる可能性のある階層関係を表すためのレシピを紹介します。階層的なデータを扱う際には、データの保存よりも階層としてのデータの取得や表示の方が難しいのが普通です。

MySQLに再帰CTEが追加されてからまだ数年しか経っていませんが、MySQLで利用できるようになったことで、実質的にすべてのRDBMSで再帰CTEが利用できるようになりました。結果として再帰CTEは階層クエリを扱う標準的な手法となりました。本章ではこの機能を自在に利用してデータの階層構造を解明するためのレシピを紹介します。

本題に入る前に、EMPテーブルのEMPNOMGR間の階層関係を調べましょう。

select empno,mgr
  from emp
 order by 2

     EMPNO        MGR
---------- ----------
      7788       7566
      7902       7566
      7499       7698
      7521       7698
      7900       7698
      7844       7698
      7654       7698
      7934       7782
      7876       7788
      7566       7839
      7782       7839
      7698       7839
      7369       7902
      7839

これをよく見ると、MGRの値もEMPNOであることわかります。つまり、EMPテーブルの従業員の管理職もEMPテーブルの従業員であり、別のどこかに格納されているわけではありません。MGREMPNO間の関係は、MGRの値があるEMPNOの直近の親であるという点で親子関係です(また、ある特定の従業員の管理職も管理職を持ち、その管理職がまた管理職を持つといったようにn層の階層を形成する可能性もあります)。従業員が管理職を持たない場合には、MGRNULLになります。

レシピ13.1 親子関係を表す ...

Get SQLクックブック 第2版 ―データベースエキスパート、データサイエンティストのための実践レシピ集 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.