GaussDB(DWS) GDS导入容错详解(gaussdbdws8.1客户端安装步骤)
2400
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),即:
-- 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小时内删除侵权内容。