十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容介紹了“怎么用PostgreSQL對(duì)樹(shù)進(jìn)行遍歷”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)從2013年成立,先為青浦等服務(wù)建站,青浦等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為青浦企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
昨天我用MySQL來(lái)實(shí)現(xiàn)了ORACLE的遞歸語(yǔ)句CONNECT BY, 看起來(lái)稍復(fù)雜些。今天來(lái)看看POSTGRESQL如何實(shí)現(xiàn)ORACLE的CONNECT BY。
還是用昨天同樣的表以及數(shù)據(jù)。POSTGRESQL自詡最像ORACLE的數(shù)據(jù)庫(kù),所以大部分語(yǔ)句也就都可以簡(jiǎn)單而且變相的實(shí)現(xiàn)了。
在這點(diǎn)上可以用他自己帶的WITH遞歸功能,還可以用第三方擴(kuò)展帶來(lái)的類(lèi)似connect by 函數(shù)。
先來(lái)看第一點(diǎn),用遞歸的WITH來(lái)展現(xiàn)這棵樹(shù)的路徑。
t_girl=# with recursive tmp_country(id,path) as t_girl-# ( 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 t_girl(# union all 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) t_girl(# inner join country as b on (a.id = b.id) t_girl(# ) t_girl-# select a.path from tmp_country as a; path ----------------------------------------------- /Earth /Earth/North America /Earth/South America /Earth/Europe /Earth/Asia /Earth/Africa /Earth/Australia /Earth/North America/Canada /Earth/North America/Central America /Earth/North America/Island Nations /Earth/North America/United States /Earth/North America/United States/Alabama /Earth/North America/United States/Alaska /Earth/North America/United States/Arizona /Earth/North America/United States/Arkansas /Earth/North America/United States/California (16 rows) Time: 3.260 ms
還可以用tablefunc擴(kuò)展帶來(lái)的CONNECT BY函數(shù)把這棵樹(shù)遍歷出來(lái)。
由于昨天設(shè)計(jì)的兩張表通過(guò)ID來(lái)關(guān)聯(lián),這個(gè)擴(kuò)展自帶的函數(shù)要把名字展現(xiàn)出來(lái)比較麻煩,索性這里我就用了一張臨時(shí)表保存我想要的結(jié)果。
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; SELECT 16 Time: 11.773 ms t_girl=#
這里更新了對(duì)應(yīng)的ID為NAME。
t_girl=# update tmp_country_relation set parentname = a.name from country as a where parentid = a.id; UPDATE 15 Time: 1.829 ms
我用TABLEFUNC擴(kuò)展帶來(lái)的CONNECT BY 實(shí)現(xiàn)這棵樹(shù)的遍歷。
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;
path
----------------------------------------------
Earth
Earth/Australia
Earth/North America
Earth/Africa
Earth/South America
Earth/Europe
Earth/Asia
Earth/North America/Island Nations
Earth/North America/Canada
Earth/North America/Central America
Earth/North America/United States
Earth/North America/United States/California
Earth/North America/United States/Arkansas
Earth/North America/United States/Alabama
Earth/North America/United States/Alaska
Earth/North America/United States/Arizona
(16 rows)
Time: 5.974 ms
t_girl=#“怎么用PostgreSQL對(duì)樹(shù)進(jìn)行遍歷”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!