GaussDB(DWS)遞歸(with recursive)執行邏輯解析

      網友投稿 2702 2025-03-31

      在一些復雜的數據倉庫應用中,遞歸(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)產品幫助文檔。

      GaussDB(DWS)遞歸(with recursive)執行邏輯解析

      EI企業智能 Gauss AP 數據倉庫服務 GaussDB(DWS)

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:家居定制拆單軟件:解決家裝拆單難題的利器
      下一篇:excel教程之成組填充多張表格(excel如何成組填充)
      相關文章
      亚洲毛片基地日韩毛片基地 | 亚洲AV综合色区无码二区偷拍 | 911精品国产亚洲日本美国韩国| 亚洲日韩一中文字暮| 亚洲AV日韩AV永久无码下载| 国产亚洲精久久久久久无码AV| 国产亚洲福利精品一区二区| 狠狠综合亚洲综合亚洲色| 亚洲日韩国产二区无码| 亚洲一本到无码av中文字幕 | 7777久久亚洲中文字幕| 亚洲中文久久精品无码1| 亚洲乱码一二三四区国产| 亚洲欧洲精品久久| 亚洲av无码片区一区二区三区| 亚洲图片激情小说| 亚洲18在线天美| 亚洲成A人片在线播放器| 亚洲熟伦熟女专区hd高清| 亚洲乱码无人区卡1卡2卡3| 亚洲av永久无码精品网址| 国产综合激情在线亚洲第一页| 亚洲不卡无码av中文字幕| 亚洲A∨精品一区二区三区| 亚洲区日韩区无码区| 精品国产人成亚洲区| 久久亚洲国产午夜精品理论片| 久久精品国产亚洲AV麻豆~| 亚洲性天天干天天摸| 亚洲国产精品网站久久| 中文字幕乱码亚洲精品一区 | 色天使色婷婷在线影院亚洲| 亚洲国产精品日韩| 亚洲无线码在线一区观看| 久久精品国产精品亚洲艾草网| 亚洲视频小说图片| 亚洲砖码砖专无区2023| 日日摸日日碰夜夜爽亚洲| 国产亚洲精品a在线观看| 亚洲电影免费在线观看| 亚洲国产品综合人成综合网站|