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,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...
随机推荐
- 【题解】Educational Codeforces Round 150(CF1841)
赛时过了 A-E,然后就开摆了,为什么感觉 C 那么无厘头[发怒][发怒] 排名:25th A.Game with Board 题目描述: Alice 和 Bob 玩游戏,他们有一块黑板.最初,有 \ ...
- 网关冗余协议:FHRP、HSRP(思科)、VRRP、GLBP
参考链接: CHANNEL技术与网关冗余 VRRP和HSRP的区别
- Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?
本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间 ...
- Pandas: title函数的作用
代码演示 将首字母大写,其余小写 效果演示 参考链接 https://www.w3resource.com/pandas/series/series-str-title.php
- Go函数可以返回多个值
1 package main 2 3 import "fmt" 4 5 func swap(x, y string) (string, string){ 6 return y,x ...
- NativeBuferring,一种零分配的数据类型[下篇]
上文说到Unmanaged.BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unm ...
- 数据分析师如何用SQL解决业务问题?
本文来自问答. 提问:数据分析人员需要掌握sql到什么程度? 请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同阶段会有不同的要求吗? 正 ...
- HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告
听学长说这道题很ex,但是思路想到的话还是挺简单的. 可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线. 但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可. ...
- ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载
一.ChatGPT生成markdown源代码 问: 我想做一份ChatGPT变现方法的PPT,请生成丰富的教学展示内容,因为生成PPT是需要MarkDown格式的,请您输出Markdown格式的内容 ...
- Ceph-部署
Ceph规划 主机名 IP地址 角色 配置 ceph_controler 192.168.87.202 控制节点.MGR Centos7系统500G硬盘 ceph_node1 192.168.87.2 ...