(再帰付き)PostgreSQLの再帰クエリ、クエリによって接続するOracleのカスケードを置き換えます

需要の開発は、地域テーブル再帰クエリの必要性を述べ、Postgresは再帰クエリ(一般的に> = 2層)を満たすために再帰クエリと方法を持っています。次のようにテストは以下のとおりです。

テーブルTB作成(ID VARCHARを(3)、PID VARCHAR(3)、名前VARCHAR(10)); 

INSERT INTO TB値( '002'、0、 '浙江'); 
INSERT INTO TB値( '001'、0 '広東省'); 
INSERT INTO TB値( '003'、 '002'、 '衢州');   
INSERT INTO TB値( '004'、 '002'、 '杭州'); 
INSERT INTO TB値( '005'、 '002'、 '湖州市');   
INSERT INTO TB値( '006'、 '002'、 '嘉興'); 
INSERT INTO TB値( '007'、 '002'、 '寧波' );   
INSERT INTO TB値( '008'、 '002'、 '紹興'); 
INSERT INTO TB値( '009'、 '002'、 '泰');   
INSERT INTO TB値( '010'、 ' 002 "'温州'); 
INSERT INTO TB値( '011'、 '002'、 '麗水');   
INSERT INTO TB値( '012'、 '002'、 '金華')。
TB値( '013'に挿入 、 '002'、 ' ;舟山')   
INSERT INTO TB値( '014'、 '004'、 'アップタウン'); 
INSERT INTO TB値( '015'、 '004' 、 '都市下');   
INSERT INTO TB値( '016'、 '004'、 '拱墅'); 
INSERT INTO TB値( '017'、 '004'、 '余杭'); 
INSERT INTO TB値( '018'、 '011'、 'Jindong'); 
INSERT INTO TB値( '019'、 '001'、 '広州'); 
INSERT INTO TB値( '020'、 '001'、「シンセン「);

テスト文で、クエリや浙江省で、次の郡:

AS RECURSIVE CTE =#テストと
テスト- #(
テスト(#SELECT a.id、a.name、ID = '002' TB Aからa.pid 
試験(#連合全   
試験(#SELECT k.id、K.名前、インナーTB K CTE Cに参加= c.ID ON k.pidからk.pid 
CTEから試験(#)SELECT ID、名前、
 ID |名   
----- + -------- 
 002 |浙江省、
 003 |衢州
 004 |杭州
 005 |湖州市、
 006 |嘉興
 007 |寧波
 008 |紹興市、
 009 |泰
 010 |温州市、
 011 |麗水市、
 012 |金華
 013 |舟山
 014 |アップタウン
 015 |都市下
 016 |拱墅
 017 |余杭区
 018 | Jindong 
(17行)

クエリは、このような無限ループジャンプなどのエラーがある場合は、親フィールドと同じのサブフィールド内のデータかどうかを確認する必要があります。 

あなたが表示されている階層をしたい場合は、書くことができます 

RECURSIVE CTE =#テストASと

a.idを選択して、ID = '002' TB AからキャストVARCHAR(100)AS(a.name)
ユニオンすべて 
SELECT k.id、キャスト(c.NAME || '>'名前AS VARCHARのk.name ||(100))ように、内側TB K CTE Cに参加= c.ID k.pid ON
)SELECT ID、CTEの名前、
 ID |名         
----- ----- + -----------------
 002 |浙江省
 003 |浙江>衢州市、
 004 |浙江>杭州、
 005 |浙江省>湖州市、
 006 |>浙江省嘉興市
 007 |>寧波市、浙江省、
 008 |浙江省>紹興市、
 009 |浙江省>泰州
 010 |浙江省>温州市、
 011 |浙江省>麗水市、
 012 |浙江省>金華市、
 013 |浙江>舟山市、
 014 |上の浙江>杭州>都市
 浙江省>杭州>地区の下| 015
 016 |浙江>杭州>拱墅
 017 |浙江>杭州>余杭区
 018 |浙江省>麗水市> Jindong
(17行)



PS:MYSQL一見そうでない機能のうち 
類似したのSQLServerのクエリ構文のちなみに再帰が、再帰的に削除することができ、例えば:

RECURSIVEとしてCTEを有する
 ID = '002' TB Aからa.pid選択a.id、a.name、
 組合全てが   
 結核kからk.id、k.name、k.pidを選択内側は、C上のCTE cを加入します。 ID = k.pid 
 CTE)から選択ID、名前。
 
http://my.oschina.net/Kenyon/blog/55137   -このマスターのブログからpgsqlの

おすすめ

転載: www.cnblogs.com/remember-forget/p/11277123.html