上次我們講了 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)這棵樹的路徑,代碼如下:
- 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 --Vevb.com
- -----------------------------------------------
- /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ò)展帶來的CONNECT BY函數(shù)把這棵樹遍歷出來,由于昨天設(shè)計(jì)的兩張表通過ID來關(guān)聯(lián),這個(gè)擴(kuò)展自帶的函數(shù)要把名字展現(xiàn)出來比較麻煩,索性這里我就用了一張臨時(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=#
這里更新了對應(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ò)展帶來的CONNECT BY 實(shí)現(xiàn)這棵樹的遍歷,代碼如下:
- 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=#
新聞熱點(diǎn)
疑難解答
圖片精選