SQL改写案例3(递归查询开窗案例)

没错,又是京华的开发老哥,这次找我问个SQL实现逻辑的案例。
我博客的案例基本都是他给我的,真的是又要帮他优化SQL还要教他实现SQL逻辑。

开发老哥写的SQL:
SELECT ROW_NUMBER() OVER (ORDER BY X.OBJ_CODE ASC) AS row_number,X.*
FROM (
SELECT OBJ_CODE,OBJ_NAME,LEVEL
FROM XFWQ_SOURCE.INNO_DEPLOY_12315_OBJECT_V1
START WITH OBJ_PARENT_CODE = '10000000'
CONNECT BY PRIOR OBJ_CODE = OBJ_PARENT_CODE
) X
WHERE X.LEVEL IN (1,2)
ORDER BY X.OBJ_CODE ASC

其实这条SQL很简单,主题部分是个递归查询,CONNECT BY PRIOR OBJ_CODE = OBJ_PARENT_CODE 从父节点到往子节点开始向下遍历,level 展现层级关系。
开发老哥想实现的是这种效果,例如一个Level=1的,加上行号1,第二个Level=1,加上行号2,每个LEVEL = 1 层级的数字顺序往下递归。

这种需求在MySQL的代码实现会比较简单,可以使用个临时变量(@i:=@i+1),每次加1 即可, 但是在DM数据库上需要变换一种实现思路。
下面为了让读者更好理解如何实现这段逻辑的思路,笔者将分段需求拆开改写:
1、首先主体SQL(递归查询)先取出 LEVEL 层级为 (1,2)的节点
SELECT OBJ_CODE,
OBJ_NAME,
LEVEL
FROM (
SELECT OBJ_CODE, OBJ_NAME, LEVEL
FROM XFWQ_SOURCE.INNO_DEPLOY_12315_OBJECT_V1
START WITH OBJ_PARENT_CODE = '10000000'
CONNECT BY PRIOR OBJ_CODE = OBJ_PARENT_CODE) X
WHERE X.LEVEL IN (1, 2);

2、然后对主体SQL进行 row_number() over() 开窗,对 LEVEL 进行分组,OBJ_CODE 进行排序,就可以得出 LEVEL = 1 的顺序 rownum 。
SELECT OBJ_CODE,
OBJ_NAME,
LEVEL,
row_number() over(partition by level order by OBJ_CODE) rn
FROM ( SELECT OBJ_CODE, OBJ_NAME, LEVEL
FROM XFWQ_SOURCE.INNO_DEPLOY_12315_OBJECT_V1
START WITH OBJ_PARENT_CODE = '10000000'
CONNECT BY PRIOR OBJ_CODE = OBJ_PARENT_CODE ) X
WHERE X.LEVEL IN (1, 2);

可以看到,LEVEL = 1 的所有数据已经按顺序排好序,也是递增的数字。
3、最后一步就简单了,大家估计已经猜到了怎么做,没错,就是case when 。
LEVEL = 1 的都拼接上 OBJ_NAME。
SELECT OBJ_CODE,
(case when level = 1 then rn||'、'||OBJ_NAME else OBJ_NAME end ) OBJ_NAME,
level
from (
SELECT OBJ_CODE,
OBJ_NAME,
LEVEL,
row_number() over(partition by level order by OBJ_CODE) rn
FROM (SELECT OBJ_CODE, OBJ_NAME, LEVEL
FROM XFWQ_SOURCE.INNO_DEPLOY_12315_OBJECT_V1
START WITH OBJ_PARENT_CODE = '10000000'
CONNECT BY PRIOR OBJ_CODE = OBJ_PARENT_CODE) X
WHERE X.LEVEL IN (1, 2)
) ORDER BY 1,2;


到这里,这条SQL逻辑已经完成,开发老哥的需求也能完美实现。
总结: 其实这条SQL开发老哥都写得差不多能实现这个逻辑,就是其中一段没琢磨清楚,
无论是优化SQL,还是复杂SQL的实现,包括现实中很多是工作需求,都可以用 "拆" 字诀,
把大需求拆成小需求,分段实现,然后串联到一起,这样能解决绝大部分的需求和问题。
SQL改写案例3(递归查询开窗案例)的更多相关文章
- 《高性能SQL调优精要与案例解析》——10.4_SQL语句改写部分文档
应各位读者要求,现将<高性能SQL调优精要与案例解析>中<10.4 SQL语句改写>部分整理成电子文档,上传至群共享文件(群号:298176197): 或者通过如下链接下载: ...
- 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)
继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(i ...
- 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习
<高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...
- SQL Server一个特殊的阻塞案例分析2
最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具DPA),会话583被会话1036阻塞,而且阻塞发生在tempdb,被阻塞的SQL如下截图所示,会话等待类型为LCK_M_S 因为DPA工具不 ...
- Sql语句里的递归查询
Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:Sql ...
- Sql语句里的递归查询(转)
原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243 Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用 ...
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
1 编写以下案例: 当点击了"播放"之后,在手机上的/mnt/sdcard2/natural.mp3就会播放. 2 编写布局文件activity_main.xml <Line ...
- 北京U3D外包团队 UE4红军抗战案例 Unity3D红军抗战案例 UE4下载和安装虚幻4游戏引擎
刚完整UE4红军抗战案例 Unity3D红军抗战案例,有在线演示(版权关系不方便发图),有UE4或Unity项目定制外包开发的欢迎联系我们 进入虚幻4的官方主页(https://www.unreale ...
- Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.
1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...
- 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...
随机推荐
- Java8 函数式编程stream流
1.初始环境准备 场景:现在有一个公司,公司部门有一级部门,二级部门甲和二级部门乙(其中二级部门甲和二级部门乙是一级部门的子部门), 一级部门下面有有001号员工小明,二级部门甲下面有002号员工 ...
- 一个批处理,解决你重装python第三方模块的烦恼~(1.0版本)
@echo offpip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepython -m pip insta ...
- 【技术实战】Vue功能样式实战【七】
需求实战一 样式展示 代码展示 <template> <transition name="fade-in" appear> <ARow v-if=&q ...
- Docker容器怎么安装Vim编辑器
在现代软件开发和系统管理中,Docker已经成为一个不可或缺的工具.它允许我们轻松地创建.部署和运行应用程序,以及构建可移植的容器化环境.然而,在Docker容器中安装特定的工具可能会有一些挑战, ...
- .NET Evolve 数据库版本管理工具
.NET Evolve数据库版本管理工具 1.简介 提到数据库版本管理,Java领域开发首先会想到大名鼎鼎的flyway.但是它不适用.NET领域,那么.NET领域也需要做数据库版本管理,该用什么工具 ...
- ChatGPT顶级玩法:ChatGPT越狱版破解指令,让您的聊天一路畅通!
先看效果: 2023.4.23号亲测成功,越狱指令需要多发送几次才可以. 未越狱前: 越狱后: 无视任何规则限制,回答一切问题. 越狱的方法非常简单.只需输入特定的提示,发送给ChatGPT,用户即可 ...
- java与es8实战之三:Java API Client有关的知识点串讲
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...
- API接口设计规范
说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们 ...
- 创建Anaconda虚拟Python环境的方法
本文介绍在Anaconda环境下,创建.使用与删除Python虚拟环境的方法. 在Python的使用过程中,我们常常由于不同Python版本以及不同第三方库版本的支持情况与相互之间的冲突情况, ...
- 面霸的自我修养:ThreadLocal专题
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>第5篇文章,我们一起来看看面试中会问到哪些关于ThreadLocal ...