【原创】PostgreSQL 对简单树的遍历

昨天我用MySQL来实现了ORACLE的递归语句CONNECT BY, 看起来稍复杂些。今天来看看POSTGRESQL如何实现ORACLE的CONNECT BY。

还是用昨天同样的表以及数据。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
-----------------------------------------------
/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','/')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=#

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...