首页 > 数据库 >GaussDB数据库SQL系列-层次递归查询

GaussDB数据库SQL系列-层次递归查询

时间:2024-11-25 16:47:36浏览次数:10  
标签:INSERT 递归 area GaussDB 查询 VALUES SQL INTO

一、前言
层次递归查询是一种常见的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等数据库时,只要正确合理的应用递归查询,就可以更好地提高查询效率和应用性能。

——结束





详情参考: https://support.huaweicloud.com/gaussdb/index.html

标签:INSERT,递归,area,GaussDB,查询,VALUES,SQL,INTO
From: https://www.cnblogs.com/xxxmut/p/18567919

相关文章

  • GaussDB数据库SQL系列-数据去重
    一、前言数据去重在数据库中是比较常见的操作。复杂的业务场景、多业务线的数据来源等等,都会带来重复数据的存储。本文以GaussDB数据库为实验平台,将为大家详细讲解如何去重。二、数据去重应用场景数据库管理(含备份):在数据库中进行数据去重可以避免数据重复存储、备份,提高数据库......
  • GaussDB数据库的元数据及其管理简介
    一、前言GaussDB是一种分布式的关系型数据库,元数据(表、列、视图、索引、存储过程等对象)是其重要的一部分。元数据是指描述数据的数据,包括数据的定义、结构、属性、关系等信息。本文以GaussDB物理数据库为主,结合元数据的概念简单介绍一下相关内容。二、元数据简介1、元数据定义......
  • GaussDB之SQL Audit,面向应用开发的SQL审核工具
    ​前言我们先从一个SQL语句说起(以某传统单机数据库为例)。也许这就是我们业务代码中潜藏的一个SQL语句,对于一个普通开发者来说,这个语句编写工整,逻辑清晰,没有什么问题,可以直接推到代码仓中交付上线。但是一个有经验的开发者或数据库管理员可能会发现这个SQL存在诸多的优化点:两张......
  • GaussDB数据库SQL系列-SQL与ETL浅谈
    一、前言在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节从GaussDB数据库生态出发,给大家简单讲一下SQL与ETL的过程与关系。二、SQL与ETL的......
  • GaussDB数据库SQL系列-UNION & UNION ALL
    一、前言SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用SQL语言来操作数据库中的数据。而在SQL中,UNION是一个非常强大的功能,它可以将多个SELECT语句的结果合并成一个结果集。本文将以GaussDB数据库为例,介绍一下UNION操作符的使用。二、GaussDBUN......
  • GaussDB数据库SQL系列-表连接(JOIN)
    一、前言SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。二、GaussDBJOINGaussDB是华为推出的企业级分布式关系型数据库。GaussDBJOIN子句是基于两个或者多个表......
  • GaussDB数据库基础函数介绍-上
    ​目录一、函数在数据库中的作用二、GaussDB常用基础函数介绍与示例1、数字操作函数2、时间和日期处理函数3、类型转换函数4、数组函数5、范围函数6、窗口函数7、聚集函数8、安全函数9、系统信息函数10、动态脱敏函数.Tip:由于篇幅缘故,“5.范围函数、6.窗口函数、7.......
  • JDBC连接GaussDB云数据库操作示例
    ​目录一、实验环境二、登录华为云创建测试库表1、登录GaussDB云数据库2、建库、建表,用于测试3、新增普通角色(用户)用于登录及访问测试(可选)4、获取对应的公网IP三、创建java工程1、创建java工程2、添加jar包3、编辑Java代码四、执行并查看测试结果一、实验环境1、本......
  • GaussDB云数据库SQL应用系列-视图管理
    ​一、前言GaussDB是一款基于云计算技术的高性能关系型数据库,支持多种数据模型和分布式架构。在GaussDB中,视图管理是非常重要的一项功能,它可以帮助用户更方便地管理和查询数据。数据库视图管理是指对数据库中的视图进行创建、修改、删除、查询等操作的过程。二、准备条件参考......
  • GaussDB云数据库SQL应用系列—索引管理
    一、前言随着互联网的快速发展,数据量呈现爆炸式增长。如何高效地管理和查询这些数据成为了企业面临的重要问题。而数据库索引作为数据库优化的关键手段之一,对于提高数据库性能和查询效率具有重要作用。本文将介绍GaussDB云数据库的索引创建和管理方法,并结合实际应用场景进行分析......