需要の開発は、地域テーブル再帰クエリの必要性を述べ、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の