国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

PostgreSQL遍歷簡單樹的方法教程

2024-07-24 12:39:54
字體:
供稿:網(wǎng)友

上次我們講了 MySQL存儲過程實(shí)現(xiàn)Oracle鄰接模型樹形處理的方法實(shí)例,現(xiàn)在我們來看看POSTGRESQL如何實(shí)現(xiàn)ORACLE的CONNECT BY,我們可以用PostgreSQL的WITH遞歸遍歷樹.

還是用上次MySQL存儲過程實(shí)現(xiàn)Oracle鄰接模型樹形處理的方法實(shí)例同樣的表以及數(shù)據(jù),POSTGRESQL自詡最像ORACLE的數(shù)據(jù)庫,所以大部分語句也就都可以簡單而且變相的實(shí)現(xiàn)了.

在這點(diǎn)上可以用他自己帶的WITH遞歸功能,還可以用第三方擴(kuò)展帶來的類似connect by 函數(shù).

先來看第一點(diǎn),用遞歸的WITH來展現(xiàn)這棵樹的路徑,代碼如下:

  1. t_girl=# with recursive tmp_country(id,path) as  
  2. t_girl-# ( 
  3. t_girl(# select a.id,'/'||b.name as "path" from country_relation as a inner join country as b on (a.id = b.id) where a.parentid is null 
  4. t_girl(# union all 
  5. t_girl(# select a.id,q.path||'/'||b.name as "path" from country_relation as a inner join tmp_country as q on (q.id = a.parentid) 
  6. t_girl(# inner join country as b on (a.id = b.id) 
  7. t_girl(# ) 
  8. t_girl-# select a.path from tmp_country as a; 
  9.                      path   --Vevb.com 
  10. ----------------------------------------------- 
  11.  /Earth 
  12.  /Earth/North America 
  13.  /Earth/South America 
  14.  /Earth/Europe 
  15.  /Earth/Asia 
  16.  /Earth/Africa 
  17.  /Earth/Australia 
  18.  /Earth/North America/Canada 
  19.  /Earth/North America/Central America 
  20.  /Earth/North America/Island Nations 
  21.  /Earth/North America/United States 
  22.  /Earth/North America/United States/Alabama 
  23.  /Earth/North America/United States/Alaska 
  24.  /Earth/North America/United States/Arizona 
  25.  /Earth/North America/United States/Arkansas 
  26.  /Earth/North America/United States/California 
  27. (16 rows
  28.  
  29.  
  30. Time: 3.260 ms 

還可以用tablefunc擴(kuò)展帶來的CONNECT BY函數(shù)把這棵樹遍歷出來,由于昨天設(shè)計(jì)的兩張表通過ID來關(guān)聯(lián),這個(gè)擴(kuò)展自帶的函數(shù)要把名字展現(xiàn)出來比較麻煩,索性這里我就用了一張臨時(shí)表保存我想要的結(jié)果,代碼如下:

  1. t_girl=# CREATE TEMPORARY TABLE tmp_country_relation as SELECT b.id,a.name,b.parentid,''::text as parentname FROM country AS a,country_relation AS b WHERE a.id = b.id;  
  2. SELECT 16 
  3. Time: 11.773 ms 
  4. t_girl=# 

這里更新了對應(yīng)的ID為NAME,代碼如下:

  1. t_girl=# update tmp_country_relation set parentname = a.name from country as a where parentid = a.id; 
  2. UPDATE 15 
  3. Time: 1.829 ms 

我用TABLEFUNC擴(kuò)展帶來的CONNECT BY 實(shí)現(xiàn)這棵樹的遍歷,代碼如下:

  1. t_girl=# select path from connectby('tmp_country_relation as a','a.name','a.parentname','Earth',0,'/'as g(id text,parentid text,level int,path text) order by level;  
  2.                      path  
  3. ---------------------------------------------- 
  4.  Earth 
  5.  Earth/Australia 
  6.  Earth/North America 
  7.  Earth/Africa 
  8.  Earth/South America 
  9.  Earth/Europe 
  10.  Earth/Asia 
  11.  Earth/North America/Island Nations 
  12.  Earth/North America/Canada 
  13.  Earth/North America/Central America 
  14.  Earth/North America/United States 
  15.  Earth/North America/United States/California 
  16.  Earth/North America/United States/Arkansas 
  17.  Earth/North America/United States/Alabama 
  18.  Earth/North America/United States/Alaska 
  19.  Earth/North America/United States/Arizona 
  20. (16 rows)
  21.  
  22. Time: 5.974 ms 
  23. t_girl=#

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥宁县| 石渠县| 博爱县| 甘洛县| 勐海县| 镇沅| 区。| 宜良县| 海伦市| 色达县| 郎溪县| 云南省| 谢通门县| 开原市| 嘉荫县| 资溪县| 拜城县| 庆城县| 东兴市| 区。| 苗栗县| 华蓥市| 西乌珠穆沁旗| 桐梓县| 沂水县| 岳普湖县| 久治县| 福鼎市| 禄丰县| 施甸县| 高阳县| 鄂托克旗| 界首市| 聂拉木县| 屏东市| 广昌县| 宜章县| 成安县| 安吉县| 齐河县| 长岛县|