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.xdnf.cn/news/20179.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow

简介: 1.伸缩盒模型简介 2.伸缩容器、伸缩项目 3-4.主轴方向 5.主轴换行方式 6.复合属性flex-flow 7.主轴的对齐方式

互联网数字化商品管理浪潮思考:从信息化到精准运营

目录 一、商品数字化转型面临的现状分析 (一)运营方向分析 (二)商品归类分析 二、商品数字化管理建设分析 三、基础建设——商品信息数字化 (一)商品信息质量数字化的目的 (二&#xff0…

STL关联式容器之RB-tree(红黑树)

AVL-tree之外,另一个颇具历史并被广泛运用的平衡二叉搜索树是RB-tree(红黑树)。所谓RB-tree,不仅是一颗二叉搜索树,而且必须满足一下规则: 1:每个节点不是红色就是黑色 2:根节点为…

电脑系统重装小白教程

​对于很多电脑用户来说,系统出现故障或者需要清理时,重装系统是一项不可避免的操作。但是,对于没有技术基础的小白用户而言,重装系统可能会显得复杂且困难。本文将为您提供一份简洁易懂的电脑系统重装教程,帮助您顺利…

使用Ollama和Open WebUI管理本地开源大模型

Open WebUI和Ollama介绍 Open WebUI 是一个功能丰富且用户友好的自托管 Web 用户界面(WebUI),它被设计用于与大型语言模型(LLMs)进行交互,特别是那些由 Ollama 或与 OpenAI API 兼容的服务所支持的模型。O…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题,说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示,对应的VERSION信息是空的,在提示信息中可以看到,官方推荐将指纹信息上传以帮助更新服务指纹&…

向量搜索工具之 Milvus vs. Elastic

在当今数据驱动的世界中,向量数据库因其在处理大规模非结构化数据方面的卓越能力而变得越来越重要。随着数据量的爆炸性增长,如何确保这些数据库在存储和检索数十亿数据点时仍能保持高性能,成为了一个关键挑战。 Milvus和Elasticsearch都是管…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

每日学习记录003:(C++)unique_ptr和shared_ptr

每日学习记录003:(C)unique_ptr和shared_ptr 在C中,unique_ptr和shared_ptr都是智能指针,它们为动态内存管理提供了更安全、更方便的方式。 一、unique_ptr的特点 (一)独占所有权 unique_pt…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求,我基于canvas开发了这款图片加水印工具。 地址:https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 ,轻松调整水印宽高,精准适配每张图…

数字化工厂 MES 成功之艰:深度剖析与探究

系统集成的复杂性 多源异构系统对接难题 在数字化工厂的建设进程中,MES(制造执行系统)处于核心枢纽地位,需与众多不同来源、不同架构的系统进行集成。企业内部往往早已部署了诸如企业资源计划(ERP)系统、…

kimi 大模型 API 接口实现大模型对话 - python 实现

kimi API接口实现大模型对话 - python 实现,具体代码如下: 注意:api_key 需要kimi官网注册后创建。 from openai import OpenAI if __name__ __main__:client OpenAI(api_key "sk-***********", # $MOONSHOT_API_KEY 官网注册…

服务器被隔离导致无法登录

现象描述 云服务器可能会因安全违规(内容或行为违规)或因 DDoS 攻击被封堵隔离,被隔离的云服务器在控制台显示为 “BANNING” 状态。 云服务器被隔离可能由于该台服务器违反了当前法律法规的要求。您可以通过以下方式查看该台服务器是否处于…

PaddleNLP的环境配置:

PaddleNLP的环境配置: conda create -n paddle—test python3.9conda activate paddle—testpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html(paddle—test) (venv) PS D:\work\论文写…

物联网研究实训室建设方案

一、引言 随着物联网技术的快速发展,其在各个行业的应用越来越广泛,对物联网专业人才的需求也日益增加。为满足这一需求,建设一个符合现代化教学需求的物联网研究实训室,对于提高学生的实践能力和创新能力具有重要意义。本方案旨…

javaweb学习——Day2

JS对象 1、array 定义: var namenew Array(元素列表); var name[元素列表] 访问: name[索引]值 array的属性和方法 length属性,获取数组长度 foreach():遍历数组元素 x.forEach(element > { console.log(element); }); push():…

实战精选|如何使用 OpenVINO™ 在 ElectronJS 中创建桌面应用程序

点击蓝字 关注我们,让开发变得更有趣 作者 | Mikołaj Roszczyk 华沙理工大学物联网工程师 翻译 | 武卓 英特尔 AI 软件布道师 排版 | 吴紫琴 OpenVINO™ 最近,我完成了一个 demo 演示,展示了 OpenVINO™ 在 Node.js 框架中的强大功能。得益于与 Electr…

PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead

记录时使用的PyCharm版本: PyCharm 2024.3 (Professional Edition) Build #PY-243.21565.199, built on November 13, 2024 问题描述 当在PyCharm里使用pickle保存文件, 比如以下代码这样: with open(meta_save_path, wb) as f:pickle.dump(meta, f)会发现PyCharm对此发出类型…

【Docker】快速部署 Pikachu:一个包含常见 Web 安全漏洞的渗透测试练习靶场

系统介绍 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。 Pikachu上的漏洞类型列表如下: Burt Force(暴力破解漏洞) XSS…

vscode 执行 vue 命令无效/禁止运行

在cmd使用命令可以创建vue项目但是在vscode上面使用命令却不行 一、问题描述 在 cmd 中已确认vue、node、npm命令可以识别运行,但是在 vscode 编辑器中 vue 命令被禁止,详细报错为:vue : 无法加载文件 D:\Software\nodejs\node_global\vue.…