上次我们讲了 MySQL存储过程实现Oracle邻接模型树形处理的方法实例,现在我们来看看POSTGRESQL如何实现ORACLE的CONNECT BY,我们可以用PostgreSQL的WITH递归遍历树.
还是用上次MySQL存储过程实现Oracle邻接模型树形处理的方法实例同样的表以及数据,POSTGRESQL自诩最像ORACLE的数据库,所以大部分语句也就都可以简单而且变相的实现了.
在这点上可以用他自己带的WITH递归功能,还可以用第三方扩展带来的类似connect by 函数.
先来看第一点,用递归的WITH来展现这棵树的路径,代码如下:
- t_girl=#withrecursivetmp_country(id,path)as
- t_girl-#(
- t_girl(#selecta.id,'/'||b.nameas"path"fromcountry_relationasainnerjoincountryasbon(a.id=b.id)wherea.parentidisnull
- t_girl(#unionall
- t_girl(#selecta.id,q.path||'/'||b.nameas"path"fromcountry_relationasainnerjointmp_countryasqon(q.id=a.parentid)
- t_girl(#innerjoincountryasbon(a.id=b.id)
- t_girl(#)
- t_girl-#selecta.pathfromtmp_countryasa;
- path--phpfensi.com
- -----------------------------------------------
- /Earth
- /Earth/NorthAmerica
- /Earth/SouthAmerica
- /Earth/Europe
- /Earth/Asia
- /Earth/Africa
- /Earth/Australia
- /Earth/NorthAmerica/Canada
- /Earth/NorthAmerica/CentralAmerica
- /Earth/NorthAmerica/IslandNations
- /Earth/NorthAmerica/UnitedStates
- /Earth/NorthAmerica/UnitedStates/Alabama
- /Earth/NorthAmerica/UnitedStates/Alaska
- /Earth/NorthAmerica/UnitedStates/Arizona
- /Earth/NorthAmerica/UnitedStates/Arkansas
- /Earth/NorthAmerica/UnitedStates/California
- (16rows)
- Time:3.260ms
还可以用tablefunc扩展带来的CONNECT BY函数把这棵树遍历出来,由于昨天设计的两张表通过ID来关联,这个扩展自带的函数要把名字展现出来比较麻烦,索性这里我就用了一张临时表保存我想要的结果,代码如下:
- t_girl=#CREATETEMPORARYTABLEtmp_country_relationasSELECTb.id,a.name,b.parentid,''::textasparentnameFROMcountryASa,country_relationASbWHEREa.id=b.id;
- SELECT16
- Time:11.773ms
- t_girl=#
这里更新了对应的ID为NAME,代码如下:
- t_girl=#updatetmp_country_relationsetparentname=a.namefromcountryasawhereparentid=a.id;
- UPDATE15
- Time:1.829ms
我用TABLEFUNC扩展带来的CONNECT BY 实现这棵树的遍历,代码如下:
- t_girl=#selectpathfromconnectby('tmp_country_relationasa','a.name','a.parentname','Earth',0,'/')asg(idtext,parentidtext,levelint,pathtext)orderbylevel;
- path
- ----------------------------------------------
- Earth
- Earth/Australia
- Earth/NorthAmerica
- Earth/Africa
- Earth/SouthAmerica
- Earth/Europe
- Earth/Asia
- Earth/NorthAmerica/IslandNations
- Earth/NorthAmerica/Canada
- Earth/NorthAmerica/CentralAmerica
- Earth/NorthAmerica/UnitedStates
- Earth/NorthAmerica/UnitedStates/California
- Earth/NorthAmerica/UnitedStates/Arkansas
- Earth/NorthAmerica/UnitedStates/Alabama
- Earth/NorthAmerica/UnitedStates/Alaska
- Earth/NorthAmerica/UnitedStates/Arizona
- (16rows)
- Time:5.974ms
- t_girl=#