GaussDB数据库SQL系列-层次递归查询
目录
2、sys_connect_by_path(col, separator)
一、前言
层次递归查询是一种常见的SQL查询方式,特别是在一些层次化的数据存储结构中经常用到。本文主要以GaussDB数据库为实验平台,为大家讲解其使用方法。
二、GuassDB数据库层次递归查询概念
层次化结构可以理解为树状数据结构,由节点构成。举个简单的例子,如下图所示,由子节点向上查询根节点,或者由根节点遍历所有子节点:
递归查询是指查询中需要多次调用自身的查询方式。在递归查询中,查询会反复地递归进入到一个子查询中,直到查询得到满足条件的结果或遍历完整个查询范围。递归查询在数据库领域中有着重要的应用。方便数据处理,简化开发代码。
在GaussDB数据库中,递归查询可以通过使用 “select…start with…connect by…prior…” 和“WITH RECURSIVE”语法来实现。
三、GaussDB数据库层次递归查询实验示例
1、创建实验表
--创建实验表 CREATE TABLE area( a_code VARCHAR(10) ,a_name VARCHAR(10) ,p_a_code VARCHAR(10) ,a_level INT); --插入测试数据 INSERT INTO area VALUES('610000','陕西省','0','1'); INSERT INTO area VALUES('610100','西安市','610000','2'); INSERT INTO area VALUES('610101','市辖区','610100','3'); INSERT INTO area VALUES('610102','新城区','610100','3'); INSERT INTO area VALUES('610103','碑林区','610100','3'); INSERT INTO area VALUES('610104','莲湖区','610100','3'); INSERT INTO area VALUES('610111','灞桥区','610100','3'); INSERT INTO area VALUES('610112','未央区','610100','3'); INSERT INTO area VALUES('610113','雁塔区','610100','3'); INSERT INTO area VALUES('610114','阎良区','610100','3'); INSERT INTO area VALUES('610115','临潼区','610100','3'); INSERT INTO area VALUES('610116','长安区','610100','3'); INSERT INTO area VALUES('610122','蓝田县','610100','3'); INSERT INTO area VALUES('610124','周至县','610100','3'); INSERT INTO area VALUES('610125','鄠邑区','610100','3'); INSERT INTO area VALUES('610126','高陵区','610100','3'); --查看初始化结果 SELECT * FROM area;
2、sys_connect_by_path(col, separator)
描述:返回从根节点到当前行的连接路径。
参数:col为在路径中显示的列名,支持类型为CHAR/VARCHAR/NVARCHAR2/TEXT的列,参数separator为路径节点之间的分隔符。
返回值类型:text
示例:
--返回从根节点到当前行的连接路径 SELECT *, sys_connect_by_path(a_name, '-') FROM area start with a_code ='610000' connect by prior a_code = p_a_code;
3、connect_by_root(col)
描述:返回当前行的根节点值。
参数:col为输出列的名称。
返回值类型:即为所指定列col的数据类型。
示例:
--返回当前行的根节点值。 SELECT *, connect_by_root(a_name) FROM area start with a_code ='610000' connect by prior a_code = p_a_code;
4、WITH RECURSIVE
使用WITH RECURSIVE 关键字:
--使用WITH RECURSIVE WITH RECURSIVE t_area AS ( SELECT a_level,a_code,p_a_code,a_name, a_name ::varchar(50) AS path FROM area WHERE p_a_code = '0' UNION ALL SELECT t2.a_level+1,t1.a_code,t1.p_a_code, t1.a_name,CONCAT(t2.path, ',', t1.a_name) ::varchar(50) AS path FROM area t1 JOIN t_area t2 ON t1.p_a_code=t2.a_code ) SELECT * FROM t_area;
示例说明:这个查询使用了递归表达式来遍历省级行政区域关系。表达式使用了两个 SELECT 语句:第一个 SELECT 语句选取了所有父级代码为0的行政区域信息,并将它们添加到临时表 t_area 中。它们的层级选取初始化的a_level级,并且它们的路径被设置为它们的行政区名a_name。这个 SELECT 语句是递归查询的起点。第二个 SELECT 语句连接了 area表和t_area表。它选取了area表中所有具有父级行政区,并连接到t_area表中已经存在的行政区。对于每个连接的行,它们的层级是父级的层级加1,并且它们的路径是父级的路径加上逗号和它们自己的行政区。查询结果返回t_area表中所有的行政区信息。
(“::varchar(50)” 是创建实验表时的字符长度不够,需要重新定义,二是两个SELECT 语句使用 UNION ALL 连接,需要保持类型长度一致)。
四、递归查询的优缺点
1、优点
递归查询能够简化应用程序代码,方便对数据结构的处理。在一些复杂的查询场景中,递归查询能够更快地得到结果。适用于各种类型的树形结构。
2、缺点
递归查询有时可能会产生很多次递归调用,导致性能下降。算法通常比其他方法更复杂,编写比较困难。不适合处理大型数据集。
五、总结
递归查询是一种非常实用的查询方法,在处理分层数据、树形数据等复杂查询场景中非常广泛。但是,在使用递归查询时需要注意一些问题:
- 必须合理控制递归深度,防止过度递归。
- 最好不要在递归查询中执行复杂的计算和组合操作,避免占用过多资源。
- 避免在递归查询中使用ORDER BY操作,这会大大降低性能。
- 在使用递归查询时,应该谨慎处理好死循环问题。
同样的, 在使用GaussDB等数据库时,只要正确合理的应用递归查询,就可以更好地提高查询效率和应用性能。
——结束

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【高手问答第 306 期汇总】 聊聊 LLM 与知识图谱、图数据库的关系
自从今年初 ChatGPT 横空出世并风靡全球之后,我们也迎来了一个并不陌生的名词:LLM,即大语言模型。随后,众多与 LLM 相关的项目如火如荼,这项新技术点燃了人们对科技未来的无限想象。 半年过去了,人们开始冷静地审视 LLM,思考它到底能为我们带来怎样的实际效益。与此同时,在过去的半年里,图数据库 NebulaGraph 研发人员也在探索这个问题,他们结合图技术和知识图谱,进行了自己的研究和尝试。 9 月 6 日 - 9 月 12 日第 306 期高手问答我们请来了NebulaGraph 的古思为、程训焘老师与大家一起讨论 LLM 到底能为广大图技术从业者带来什么。 * 古思为:NebulaGraph 布道师,他是首个在 LlamaIndex 社区提出 Graph + RAG 概念的人; * 程训焘:NebulaGraph 核心开发者,从事图数据库的开发工作,目前致力于更好地将图数据库与 LLM 结合。 以下为部分问答汇总,梳理出来方便大家查看,希望对大家有所帮助。 问:老师你好,现在LLM很火,我理解的LLM他其实是基于已有的知识、数据,汇聚起来可以给你一些非创造性的答案、建议...
- 下一篇
XL-LightHouse 1.0.8 发布,轻松实现大数据实时统计
升级内容: 1、增加时区配置字段;2、修复jq和nc依赖包部署问题;3、完善项目文档; 一键部署,一行代码接入,无需大数据研发运维经验,轻松实现海量数据实时统计,使用 XL-LightHouse 后: 1、再也不需要用 Flink、Spark、ClickHouse 或者基于 Redis 这种臃肿笨重的方案跑数了; 2、再也不需要疲于应付对个人价值提升没有多大益处的数据统计需求了,能够帮助您从琐碎反复的数据统计需求中抽身出来,从而专注于对个人提升、对企业发展更有价值的事情; 3、轻松帮您实现任意细粒度的监控指标,是您监控服务运行状况,排查各类业务数据波动、指标异常类问题的好帮手; 4、培养数据思维,辅助您将所从事的工作建立数据指标体系,量化工作产出,做专业严谨的职场人,创造更大的个人价值; 概述 XL-LightHouse 是针对互联网领域繁杂的流式数据统计需求而开发的一套集成了数据写入、数据运算、数据存储和数据可视化等一系列功能,支持超大数据量,支持超高并发的【通用型流式大数据统计平台】。 XL-LightHouse 目前已基本涵盖了常见的流式数据统计场景,包括 count、sum、m...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启