階層問い合わせ
Oracleの階層問い合わせをPostgreSQLで実現するには、connectby()を使います。
図8のような表があったとしましょう。担当者マスタのMGR_ID列は、各行の担当者にとって、上司となる担当者のIDを表しています。
| SQL> SELECT * FROM 担当者マスタ; | |||||
| 担当者ID | 担当者名 | ふりがな | MGR_ID | 生年月日 | 性別 |
| -------- | ----------------- | ----------------- | -------- | -------- | ------ |
| 1 | 鈴木 | すずき | 60-01-23 | 1 | |
| 2 | 小野 | おの | 60-08-02 | 1 | |
| 3 | 斎藤 | さいとう | 63-10-15 | 1 | |
| 4 | 藤本 | ふじもと | 3 | 72-07-18 | 1 |
| 5 | 小林 | こばやし | 3 | 71-02-11 | 0 |
| 6 | 伊藤 | いとう | 2 | 72-04-01 | 0 |
| 7 | 佐瀬 | させ | 2 | 75-02-21 | 1 |
| 8 | 宇賀神 | うがじん | 1 | 75-12-22 | 1 |
| 9 | 岡田 | おかだ | 4 | 72-03-18 | 1 |
| 9行が選択されました | |||||
Oracleには、図8のような階層的な構造を含んだテーブルがあるときに、1つのSELECT文で図9のような出力を得ることができる「階層問い合わせ」という便利な機能があります。
担当者(階層表示)
-------------------
鈴木
宇賀神
小野
伊藤
佐瀬
斎藤
藤本
岡田
小林
9行が選択されました。 階層問い合わせは、指定された条件に従って、階層上の親から子へと段階的に該当行を検索します。図9の 出力を得るためのSELECT文は次のとおりです。START WITH句で階層問い合わせを開始するスタート行を指定し、CONNECT BY句で階層的に子となる行を指定します。
SELECT LPAD(' ', (LEVEL-1)*2) ||
担当者名"担当者(階層表示)"
FROM 担当者マスタ
START WITH MGR_ID IS NULL
CONNECT BY PRIOR 担当者ID = MGR_ID;
PostgreSQL単体には階層問い合わせの機能はありませんが、ソースコード配布パッケージのcontrib/tablefuncフォルダに、同等の機能を持つconnectby()関数が用意されています。