このコードは、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 VARCHAR(100))AS PATH_ID - ターゲットテーブルと同じフォーマットを確保 、キャスト(名前AS VARCHAR(500))AS PATH_NAME 、1 AS LEVE からORG ID = ' 1 ' - 一番上のノードの位置を指定連合すべてを- 以下は、下位ノードであるSELECT org.id 、org.name 、org.pid 、キャスト(r.id || ' / ' || org.id AS VARCHAR(100))AS PATH_ID - スプライシングスラッシュ 、キャスト(r.nameを|| ' / ' || org.name AS VARCHAR(500))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 - 親について再び関連情報を