PostgreSQLの再帰クエリの例

PostgreSQLは、クエリのための補助ステートメントを構築できるように、WITHステートメントを提供します。これらの記述は、通常、共通テーブル式またはCTEと呼ばれています。CTE似た一時テーブルは、クエリの実行時に存在しています。

再帰クエリは、再帰CTEクエリを指します。再帰クエリは、このような組織構造、BOMおよび他の階層データを照会として多くの状況において有用です

 

以下は、再帰CTEの構文を示しています。

RECURSIVE cte_name WITH(
    CTE_query_definition -非再帰的用語
    UNION [ALL] 
    CTE_queryのdefinion -再帰的な用語
)SELECT * FROM cte_name。

 

再帰CTEは、3つの要素があります。

1.非再帰用語:CTEの用語が定義されている非再帰クエリ、CTE構造セットの基本的な結果となります。

項目2.再帰:再帰的な用語の使用、またはUNION ALL UNION演算子は、一つ以上の定義された非再帰クエリCTE項目を接続します。再帰CTE参照項目名そのもの。

3.終了チェック:反復が任意の行を返さない場合は、再帰が停止します。

 

PostgreSQLは、次の順序で再帰CTEを実行します。

1.結果セット(R0)を作成するための基本的な非再帰的な用語を実行します。

2. Riを再帰入力タームとして、出力としてRiを+ 1つの結果セットを返します。

3. 手順2を繰り返し、それが空集合を返すまで。(終了チェック)

4.最終的な結果セットを返し、それが一連​​のある、または結果の全ては、R0、R1、... Rnのセットを設定し、

 

私たちは、PostgreSQLの再帰クエリを証明するために新しいテーブルを作成します。

TABLEの従業員をCREATE(
   EMPLOYEE_IDシリアルPRIMARY KEY、
   FULL_NAME VARCHAR NOT NULL、
   INTはMANAGER_ID 
)。

 EMPLOYEE_ID、MANAGER_IDとフルネーム:従業員テーブルには、3つの列で構成されています。MANAGER_ID列には、従業員のマネージャIDを指定します。

 

employees表に次の典型的な文でデータ。

(従業員。INSERT INTO 
   EMPLOYEE_ID、
   FULL_NAME、
   MANAGER_ID 
VALUES 
   (1、 'マイケル・北'、NULL)、
   (2、 'ミーガンベリー'、1)、
   (3 'サラベリー'、1)、
   (4「ゾーイブラック」、1)、
   (5、「ティム・ジェームス、1)、
   (6 'ベラタッカー'、2)、
   (7 'ライアンメトカーフ'、2)、
   (8 'マックスミルズ'、2)、 9、 'ベンジャミングローバー'、2)、
   (10 'キャロリンヘンダーソン'、3)、
   (11、 'ニコラケリー'、3)、
   (12 'アレクサンドラClimo'、3)、
   (13 'ドミニク王、3)、
   (14 'レナードグレー'、4)、
   (15 'エリック・ランプリング'、4)、
   (16 '埠頭ペイジ'、7)、 
   (17 'ライアンヘンダーソン'、7)、
   (18 'フランクタッカー'、8)、 
   (19 'ネイサンファーガソン'、8)、
   (20 'ケビン・ランプリング'、8)。

 次のクエリは、すべての下位のマネージャ2のIDを返します。

AS RECURSIVE部下WITH(
   SELECT 
      、EMPLOYEE_IDを
      MANAGER_ID、
      FULL_NAME 
   FROM 
      従業
      EMPLOYEE_ID = 2 
   UNION 
      SELECTの
         e.employee_id、
         e.manager_id、
         e.full_name 
      FROM 
         E従業
      インナー部下S上s.employee_id = e.manager_idをJOIN 
)SELECT 
   * 
FROM 
   部下;

 上記のSQLは動作します:

1.再帰CTEの部下は、非再帰的な用語や再帰的な用語を定義します。

2.非再発項目はR0、従業員2つまりIDを設定する基本的な結果を返します。

EMPLOYEE_ID | MANAGER_ID | FULL_NAME 
------------- + ------------ + ------------- 
           2 | 1 | ミーガン・ベリー

 再帰的な長期リターンスタッフIDの2つの直属。これは、従業員テーブルと部下CTEとの間の接続の結果です。再帰的な用語の最初の繰り返しは、この結果セットを返します。

EMPLOYEE_ID | MANAGER_ID | FULL_NAME 
------------- + ------------ + ----------------- 
           6 | 2 | ベラタッカー
           7 | 2 | ライアン・メトカーフ
           8 | 2 | マックスミルズ
           9 | 2 | ベンジャミン・グローバー

 PostgreSQLの再帰的な項目を繰り返します。再帰部材を用いて第2の反復ステップは、入力値として設定し、結果セットを返す結果:

EMPLOYEE_ID | MANAGER_ID | FULL_NAME 
------------- + ------------ + ----------------- 
          16 | 7 | 埠頭ペイジ
          17 | 7 | ライアン・ヘンダーソン
          18 | 8 | フランク・タッカー
          19 | 8 | ネイサン・ファーガソン
          20 | 8 | ケビン・ランプリング

 16、17及び20の職員のIDへのスタッフが存在しないため、第3の反復は、空の結果セットを返します。

 

PostgreSQLは、最終的な結果セットを返し、結果セットは、すべての結果と設定反復の第1および第2のセットを生成する非再帰的及び再帰エントリです。

EMPLOYEE_ID | MANAGER_ID | FULL_NAME 
------------- + ------------ + ----------------- 
           2 | 1 | ミーガンベリー
           6 | 2 | ベラタッカー
           7 | 2 | ライアン・メトカーフ
           8 | 2 | マックスミルズ
           9 | 2 | ベンジャミン・グローバー
          16 | 7 | 埠頭ペイジ
          17 | 7 | ライアン・ヘンダーソン
          18 | 8 | フランク・タッカー
          19 | 8 | ネイサン・ファーガソン
          20 | 8 | ケビン・ランプリング
(10行)

 このチュートリアルでは、再帰構造CTEのPostgreSQLに再帰クエリを使用する方法を学びました。

 

参考住所:のhttp://www.postgresqltutorial.com/postgresql-recursive-query/

おすすめ

転載: www.cnblogs.com/abclife/p/11022849.html