によるPostgreSQL再帰クエリの学習概要:このチュートリアルでは、再帰共通テーブル式またはCteを使用したPostgreSQL再帰クエリについて学習します。
PostgreSQL再帰クエリの概要
PostgreSQLには、クエリで使用する補助文を構築できるWITH
文が用意されています。
これらのステートメントは、多くの場合、共通テーブル式またはCteと呼ばれます。 Cteは、クエリの実行中にのみ存在する一時テーブルのようなものです。
再帰クエリは、再帰CTEを参照するクエリです。 再帰クエリは、組織構造、部品表などの階層データのクエリなど、多くの状況で役立ちます。
再帰CTEの構文を次に示します:
Code language: SQL (Structured Query Language) (sql)
再帰CTEには3つの要素があります:
- 非再帰的な用語:非再帰的な用語は、CTE構造体の基本結果セットを形成するCTEクエリ定義です。
- : 再帰用語は、UNION演算子または
UNION ALL
演算子を使用して非再帰用語と結合された1つ以上のCTEクエリ定義です。 再帰的な用語は、CTE名自体を参照します。 - 終了チェック:前の反復から行が返されない場合、再帰は停止します。
PostgreSQLは、次の順序で再帰CTEを実行します:
- 非再帰的な用語を実行して、基本結果セット(R0)を作成します。
- riを入力として再帰項を実行し、結果セットRi+1を出力として返します。
- 空のセットが返されるまでステップ2を繰り返します。 (終了チェック)
- 結果セットR0,R1,…Rnの和集合または
UNION ALL
である最終結果セットを返す
PostgreSQL再帰クエリの例
PostgreSQL再帰クエリを示すために新しいテーブルを作成します。
Code language: SQL (Structured Query Language) (sql)
employees
テーブルには、employee_id
、manager_id
、およびfull_name
の3つの列があります。 manager_id
列は、従業員のマネージャー idを指定します。
次のステートメントは、サンプルデータをemployees
テーブルに挿入します。
Code language: PHP (php)
次のクエリは、id2を持つマネージャーのすべての部下を返します。
Code language: SQL (Structured Query Language) (sql)
どのように動作しますか:
- 再帰CTEであるdefailentsは、1つの非再帰的な用語と1つの再帰的な用語を定義します。
- 非再帰的な用語は、idが2の従業員である基本結果セットR0を返します。
Code language: SQL (Structured Query Language) (sql)
再帰的な用語は、従業員id2の直接の従属を返します。 これは、employeesテーブルと従属CTEの間で結合された結果です。 再帰的な用語の最初の反復では、次の結果セットが返されます:
Code language: SQL (Structured Query Language) (sql)
PostgreSQLは再帰的な用語を繰り返し実行します。 再帰メンバーの2回目の反復では、上記のステップの結果セットを入力値として使用し、この結果セットを返します:
Code language: SQL (Structured Query Language) (sql)
id16、17、18、19、および20の従業員に従業員レポートがないため、3回目の反復では空の結果セットが返されます。
PostgreSQLは、非再帰的および再帰的な用語によって生成された最初と2番目の反復ですべての結果セットの和集合である最終結果セットを返します。
このチュートリアルでは、再帰Cteを使用してPostgreSQLの再帰クエリを構築する方法を学習しました。
- このチュートリアルは役に立ちましたか?
- はい