SQL深入理解递归查询与层级结构的处理:以拼接ID路径为例

SQL深入理解递归查询与层级结构的处理:以拼接ID路径为例

  • 一、前言
    • 1. 层级结构数据的存储
    • 2. 问题的核心:拼接 ID 路径
    • 3. 解决方案:使用递归查询
  • 二、使用递归查询的基本思路
    • 1. 实现步骤
    • 2. 关键点解析
    • 3. 示例结果
    • 4. 应用场景
  • 三、结语


一、前言

在许多实际业务场景中,我们需要处理具有层级关系的数据。例如,组织架构、产品分类、菜单结构等,往往以树形结构存储在数据库中。而在进行层级数据查询时,如何将每个节点的父节点信息串联起来,形成从根节点到当前节点的完整路径,是一个常见的问题。

本文将通过一个实际的例子,详细介绍如何使用递归查询和 SQL 字符串拼接技巧来解决这个问题,特别是如何将最上级 ID 拼接到当前 ID,形成以 ; 分隔的路径。

1. 层级结构数据的存储

首先,我们假设有一个简单的表格 hga_fcwh,用来存储一些层级关系数据。该表包含以下字段:

  • yuan_shi_id:每个节点的唯一标识。
  • quan_cheng:节点的全称。
  • jian_cheng:节点的简称。
  • shang_yi_ji:父节点的 yuan_shi_id,指向当前节点的上级。如果没有父节点,则值为 NULL

例如,表中的数据可能如下:

yuan_shi_idquan_chengjian_chengshang_yi_ji
1全称AANULL
2全称BB1
3全称CC1
4全称DD2
5全称EE3

从表中可以看出,节点 1 是顶级节点,节点 2 和节点 3 是节点 1 的子节点,节点 4 是节点 2 的子节点,节点 5 是节点 3 的子节点。

2. 问题的核心:拼接 ID 路径

我们需要实现一个查询,返回每个节点的 xiangxi_id,即拼接从根节点到当前节点的所有 ID,层级之间用 ; 分隔。例如,节点 4 的 xiangxi_id 应该是 1;2;4,而节点 5 的 xiangxi_id 应该是 1;3;5

3. 解决方案:使用递归查询

SQL 提供了递归查询的功能,常用于处理树形结构。我们可以利用递归查询实现从每个节点回溯到根节点的操作,并且在递归过程中拼接 ID。

二、使用递归查询的基本思路

递归查询通常由两部分组成:

  • 非递归部分:用于选择根节点(或层级最上级的记录)。
  • 递归部分:通过连接父节点和子节点来向下遍历树形结构,同时进行路径拼接。

1. 实现步骤

我们通过 CTE(公共表表达式) 和递归查询来实现层级数据的拼接,以下是详细的 SQL 查询:

WITH FieldHierarchy AS (-- 非递归部分:选择顶层记录SELECT yuan_shi_id,quan_cheng,jian_cheng,shang_yi_ji,CAST(yuan_shi_id AS VARCHAR(MAX)) AS xiangxi_id,  -- 初始化为自身的ID0 AS LEVELFROM hga_fcwhWHERE shang_yi_ji IS NULLUNION ALL-- 递归部分:查找子节点并拼接最上级ID到当前IDSELECT f.yuan_shi_id,f.quan_cheng,f.jian_cheng,f.shang_yi_ji,CAST(h.xiangxi_id + ';' + CAST(f.yuan_shi_id AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS xiangxi_id,  -- 拼接父ID到当前IDh.LEVEL + 1 AS LEVELFROM hga_fcwh fINNER JOIN FieldHierarchy h ON f.shang_yi_ji = h.yuan_shi_id
)-- 最终查询
SELECT yuan_shi_id,jian_cheng,quan_cheng,shang_yi_ji,xiangxi_id,LEVEL
FROM FieldHierarchy
ORDER BY LEVEL, yuan_shi_id;

2. 关键点解析

  • 非递归部分
    在递归查询的起始部分,我们选择顶级节点(shang_yi_ji IS NULL)。每个顶级节点的 xiangxi_id 被初始化为其自身的 yuan_shi_id

  • 递归部分
    在递归部分,我们通过 INNER JOIN 将当前节点和父节点连接起来,然后拼接父节点的 xiangxi_id 和当前节点的 yuan_shi_id。这样,逐层拼接出从根节点到当前节点的路径。路径中的各个 ID 通过 ; 进行分隔。

  • LEVEL 字段
    我们为每个节点引入了 LEVEL 字段,表示该节点在树形结构中的层级。LEVEL 从顶层节点开始为 0,逐层递增。

3. 示例结果

假设执行查询后的结果为:

yuan_shi_idjian_chengquan_chengxiangxi_idLEVEL
1A全称A10
2B全称B1;21
3C全称C1;31
4D全称D1;2;42
5E全称E1;3;52

如上所示,每个节点的 xiangxi_id 都包含了从根节点到该节点的所有 ID,且层级结构清晰。

4. 应用场景

  1. 组织架构:在企业中,员工有着明确的上下级关系,我们可以利用这种递归查询来获取员工的上级、下级以及整个组织结构路径。

  2. 产品分类:产品有多个层级的分类,递归查询可以帮助我们生成完整的分类路径,便于查询和展示。

  3. 菜单结构:网站或应用中的菜单通常有层级关系,可以通过递归查询获取完整的菜单路径,便于渲染菜单。

三、结语

通过本文,我们深入探讨了如何利用递归查询处理树形结构数据,并且通过拼接路径来实现从根节点到每个节点的完整标识。递归查询不仅能够有效处理层级数据,而且在解决类似问题时非常高效,尤其是当数据量较大时,可以大幅简化查询和计算过程。

对于不同的数据库系统,你可能需要根据具体的语法和函数(如 STRING_AGGGROUP_CONCAT 等)做出适当调整,但核心思路是一致的。希望通过这篇文章,大家能够更好地理解和运用递归查询来处理复杂的层级数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477433.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P1722 矩阵 II C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1722 我们按照案例画一下 我们会发现&#xff0c;会出现重复的子结构。 代码如下&#xff1a; #include<iostream> using namespace std; int mem[300][300]; int n; int f[305][305]; int dfs(int x,int red,…

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展&#xff0c;流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言&#xff0c;把握这些趋势并积极应对挑战将是实现成功的关键…

半导体、晶体管、集成电路、芯片、CPU、单片机、单片机最小系统、单片机开发板-概念串联辨析

下面概念定义从小到大串联&#xff1a; 半导体&#xff08;semiconductor&#xff09;&#xff1a; 是一类常温下导电性能介于导体与绝缘体之间的材料&#xff0c;这种材料的导电性可以随着外部环境比如电压、温度、光照的变换而改变&#xff0c;导电特性区别于导体、超导体、…

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2024.3/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项目…

app小程序web安全—sign签名绕过

一、环境准备 本文测试环境为JeecgBoot&#xff0c;代码链接&#xff1a;jeecgboot/Github 环境配置链接&#xff1a;IDEA启动项目 - JeecgBoot 文档中心 配置好依赖和数据库后启动后端&#xff1a;org.jeecg.JeecgSystemApplication 启动Vue3前端&#xff0c;点击dev&…

Javaweb前端HTML css 整体布局

最后一个是线条颜色 盒子&#xff0c;整体还是300&#xff0c;400

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

003 STM32基础、架构以及资料介绍——常识

注&#xff1a; 本笔记参考学习B站官方视频教程&#xff0c;免费公开交流&#xff0c;切莫商用。内容可能有误&#xff0c;具体以官方为准&#xff0c;也欢迎大家指出问题所在。 01什么是STM32&#xff08;宏观&#xff09; STM32属于一个微控制器&#xff0c;自带了各种常用通…

flutter 专题十七 Flutter Flar动画实战

Flutter Flar动画实战 在Flare动面出现之前&#xff0c;Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画&#xff0c;如果遇到一些复杂的场景&#xff0c;使用这些动画方案实现起来还是有难度的。不过&#xff0c;随着Flutter开始支持Flar…

uniapp 自定义popup 弹窗 简单封装(微信小程序)

效果并不完整&#xff0c;有需求可以自行修改 适用于vue2 弹窗只支持居中弹出和下方弹出&#xff0c;内容可以自定义 效果图 子组件 代码 新建组件文件夹 zPopup <template><view class"zPopup_show" v-if"style_show":class"mod…

网络爬虫——常见问题与调试技巧

在开发网络爬虫的过程中&#xff0c;开发者常常会遇到各种问题&#xff0c;例如网页加载失败、数据提取错误、反爬机制限制等。以下内容将结合实际经验和技术方案&#xff0c;详细介绍解决常见错误的方法&#xff0c;以及如何高效调试和优化爬虫代码。 1. 爬虫过程中常见的错误…

[面试]-golang基础面试题总结

文章目录 panic 和 recover**注意事项**使用 pprof、trace 和 race 进行性能调试。**Go Module**&#xff1a;Go中new和make的区别 Channel什么是 Channel 的方向性&#xff1f;如何对 Channel 进行方向限制&#xff1f;Channel 的缓冲区大小对于 Channel 和 Goroutine 的通信有…

从 HTML 到 CSS:开启网页样式之旅(二)—— 深入探索 CSS 选择器的奥秘

从 HTML 到 CSS&#xff1a;开启网页样式之旅&#xff08;二&#xff09;—— 深入探索 CSS 选择器的奥秘 前言一、CSS基本选择器1. 通配选择器2. 元素选择器3. 类选择器4. id选择器5.基本选择器总结 二、CSS复合选择器1. 后代选择器2. 子选择器3. 相邻兄弟选择器4.交集选择器5…

Python的3D可视化库 - vedo (2)visual子模块 基本可视化行为

文章目录 1. visual模块的继承关系2. 基类CommonVisual的方法2.1 获取对象信息2.1.1 对象本身信息2.1.2 对象的查找表2.1.3 对象标量范围2.1.4 对象缩略图 2.2 呈现对象2.2.1 在窗口显示1.2.2 对象可见性 2.2.3 对象颜色2.2.4 对象透明度 2.3 添加标度条2.3.1 2D标度条2.3.2 3D…

Typora+PicGo+云服务器搭建博客图床

文章目录 前言一. 为什么要搭建博客图床&#xff1f;1.1 什么是图床&#xff1f;1.2 为什么要搭建博客图床? 二. 安装软件三. 配置阿里云OSS3.1 注册,开通对象储存3.2 创建bucket3.3 找到你的地域节点3.4 accessKeyId和accessKeySecret3.5 给你的阿里云账户充值 四. 配置4.1 配…

下载安装Android Studio

&#xff08;一&#xff09;Android Studio下载地址 https://developer.android.google.cn/studio 滑动到 点击下载文档 打开新网页 切换到english ![](https://i-blog.csdnimg.cn/direct/b7052b434f9d4418b9d56c66cdd59fae.png 等待一会&#xff0c;出现 点同意后&#xff0…

【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感

本文将介绍如何使用LSTM训练一个能够创作诗歌的模型。为了训练出效果优秀的模型&#xff0c;我整理了来自网络的4万首诗歌数据集。我们的模型可以直接使用预先训练好的参数&#xff0c;这意味着您无需从头开始训练&#xff0c;即可在自己的电脑上体验AI作诗的乐趣。我已经为您准…

大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法

1. 梯度介绍 如果我们在一座山上&#xff08;一个山的坡度有很多&#xff0c;陡峭的&#xff0c;平缓的&#xff09;&#xff0c;想要从山顶下山。而梯度就像告诉我们如何沿着最陡的下坡路线走&#xff0c;以尽快到达山脚&#xff08;最低点&#xff09;。 2. 梯度的定义 梯度…

鸿蒙学习高效开发与测试-测试工具(5)

文章目录 1、单元测试2、集成测试1. UI 测试框架2. DevEco Testing 测试平台2.1 稳定性测试2.2 场景化性能测试2.3 回归测试2.4 基础质量测试服务3. 命令行测试工具3.1 DevEco Testing SmartPerf3.2 DevEco Testing wukong3、专项测试1. 应用与服务体检2. 专项测试云测平台鸿蒙…

NFS搭建

NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…