再帰的にツリー構造を使用してGreenplumは(PostgreSQLには)再帰クエリを実行すると、新しいテーブルを挿入します

このコードは、Oracleの声明による接続の代替物、および後者のパスで、idleaf機能を実現します。

テキストが始まりました:

  フィールドは、ID(番号)、名前(名)、PID(高い番号)を有し、最上位の記録PIDが空である、テーブル組織を仮定する。

以下のような:

id名のPID

グループ1つのヌル

金融1 2省

3管理1

4会計ホスト2

 

  ターゲット表neworgを達成:

id名PID PNAME PATH_ID PATH_NAME leveのis_leaf(リーフノード)

1グループヌルヌル/ 1/10グループ

ファイナンス・20のグループ財務部2 1/1/2 /グループ/省

3グループの管理部門1/1/3 /グループ/管理21

財務会計4 2/1/2 /グループ/財務省/会計士21の省後援

 

  コード手書き、スペルミスは、場合はご容赦ください。

SETの gp_recursive_cte_prototype する TURE; - 低バージョンGreenplumはの一部を追加しなければならない
INSERT  INTO NewOrgは
    上記is_leaf、ID、名前、PID、PATH_ID、PATH_NAME、leveの言及
これresult_再帰AS  - 体の再帰開始
SELECTは、上記IDを言及- 最初の最上位ノードです
    、名前
    、PID キャスト(ID AS  VARCHAR100))AS PATH_ID - ターゲットテーブルと同じフォーマットを確保キャスト(名前AS  VARCHAR500))AS PATH_NAME 1  AS LEVE
     からORG 
     ID = ' 1 ' - 一番上のノードの位置を指定連合すべてを- 以下は、下位ノードであるSELECT org.id 
    、org.name 
    、org.pid キャスト(r.id || ' / ' || org.id AS VARCHAR100))AS PATH_ID - スプライシングスラッシュキャスト(r.nameを|| '  
      
        / '  || org.name AS  VARCHAR500))AS PATH_NAME - スラッシュスプライシング 
    、r.leve用+  1  AS LEVE - たびに再帰1 +0  AS is_leaf
     から result_のR&LT - これはであることに注意result_ 
    参加 ORGをON org.pid = r.id - 注意が実際に参加インナーで親子関係を、指定する
    WHERE  1  =  1  - 他の条件があるが、ここで追加することができます
- その後、どこresult_同時に処理is_leafを照会することができますフィールド
の選択t.id、t.name、t.pid、org.name AS PNAME ' / '  || t.path_id AS PATH_ID - トップスラッシュを見逃さない書式設定' / '  || t.path_name AS PATH_NAME 
、T .leve ケース  TRIM(t.id)におけるSELECT DISTINCT a1.pid から ORG A1)を、次いで0 他の1 及びAS id_leafは- ここで大量のデータテーブルを書き込むときに、葉ノードかどうかを判断します効率が低い、新しいと余分考えます。      
result_トン
 左の 参加 ORGをON t.pid = org.id - 親について再び関連情報を

 

おすすめ

転載: www.cnblogs.com/lbhqq/p/11577024.html