GaussDB(DWS)遞歸(with recursive)執行邏輯解析
在一些復雜的數據倉庫應用中,遞歸(with recursive)是一種常見的業務,常用于一些查詢上下級關系的場景,舉例如下:
有一張包含省市區劃信息的表,id是行政單位編號,pid是上級行政單位編號,name是行政單位名稱
CREATE TABLE city ( id INTEGER, pid INTEGER, name TEXT ); insert into city values (1,0,'陜西省'), (11,1,'西安市'), (12,1,'寶雞市'), (111,11,'雁塔區'), (112,11,'碑林區');
執行如下遞歸查詢,可以將行政單位的上下級關系展示出來
WITH RECURSIVE subcity AS ( SELECT id, name FROM city WHERE id = 1 UNION ALL SELECT origin.id, subcity.name || ' > ' || origin.name FROM subcity JOIN city origin ON origin.pid = subcity.id ) SELECT id, name FROM subcity order by 1,2;
查詢結果如下:
id | name -----+-------------------------- 1 | 陜西省 11 | 陜西省 > 西安市 12 | 陜西省 > 寶雞市 111 | 陜西省 > 西安市 > 雁塔區 112 | 陜西省 > 西安市 > 碑林區 (5 rows)
我們從邏輯上理解一下遞歸的執行流程:
首先解釋遞歸查詢的兩個部分
1、non-recursive term(非遞歸部分),即union前面部分
2、recursive term(遞歸部分),即union后面部分
先假設兩張臨時表:工作表(WorkTable),結果表(ResultTable)。
第一步:執行非遞歸部分(non-recursive term),即:
-- non-recursive term SELECT * FROM city WHERE id = 1
返回結果集同時放在 subcity 和 ResultTable 中。
第二步:執行遞歸部分(recursive term),即
-- recursive term SELECT d.* FROM city AS d JOIN subcity AS sd ON (d.pid = sd.id)
執行完后得到臨時結果集,放入 WorkTable 中;
WorkTable 若不為空,用 WorkTable 結果集替換 subcity 結果集,同時把 WorkTable 結果集加入到 ResultTable 結果集中。然后清空 WorkTable,回到第二步繼續執行。
WorkTable 若為空,跳出循環。
第三步:遞歸結束,跳出循環后,ResultTable 就保存著最終的結果集,用 ResultTable 結果集替換 subcity 結果集。
接下來按照例子實際執行一下
一、首先執行SELECT * FROM city WHERE id = 1,得到的結果集為
(1,0,'陜西省')
存入 subcity 和 ResultTable
二、
subcity 與 select * from city 進行關聯查詢,關聯條件為 subcity.id=city.pid
SELECT d.* FROM city AS d JOIN subcity AS sd ON (d.pid = sd.id)
得到結果集為
(11,1,'西安市'),
(12,1,'寶雞市')
放入 WorkTable 中,并替換掉 subcity,然后把結果存入 ResultTable
由于 join結果集 不為空,繼續執行 subcity 和 city 的關聯,得到結果集為
(111,11,'雁塔區'),
(112,11,'碑林區')
放入 WorkTable 中,并替換掉 subcity,然后把結果存入 ResultTable
由于 join結果集 不為空,繼續執行 subcity 和 city 的關聯,得到結果集為空
由于上一步結果集為空,跳出步驟二
三、此時 ResultTable 中記錄如下,即為最終執行結果,輸出即可
(1,0,'陜西省')
(11,1,'西安市'),
(12,1,'寶雞市'),
(111,11,'雁塔區'),
(112,11,'碑林區')
如上僅從語句的邏輯上介紹了GaussDB(DWS)的遞歸(with recursive)執行流程,關于遞歸(with recursive)的使用方法和規格約束,請大家參考GaussDB(DWS)產品幫助文檔。
EI企業智能 Gauss AP 數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。