GaussDB(DWS)递归(with recursive)执行逻辑解析

网友投稿 2332 2022-05-30

在一些复杂的数据仓库应用中,递归(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),即:

GaussDB(DWS)递归(with recursive)执行逻辑解析

-- 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小时内删除侵权内容。

上一篇:VS code常用的快捷键
下一篇:zip与unzip命令谅解及,压缩文件但不包含某目录的操作。
相关文章