没错,又是京华的开发老哥,这次找我问个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(递归查询开窗案例)的更多相关文章

  1. 《高性能SQL调优精要与案例解析》——10.4_SQL语句改写部分文档

    应各位读者要求,现将<高性能SQL调优精要与案例解析>中<10.4 SQL语句改写>部分整理成电子文档,上传至群共享文件(群号:298176197): 或者通过如下链接下载: ...

  2. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

    继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(i ...

  3. 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习

    <高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...

  4. SQL Server一个特殊的阻塞案例分析2

    最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具DPA),会话583被会话1036阻塞,而且阻塞发生在tempdb,被阻塞的SQL如下截图所示,会话等待类型为LCK_M_S 因为DPA工具不 ...

  5. Sql语句里的递归查询

    Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:Sql ...

  6. Sql语句里的递归查询(转)

    原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243 Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用 ...

  7. 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现

    1 编写以下案例: 当点击了"播放"之后,在手机上的/mnt/sdcard2/natural.mp3就会播放. 2 编写布局文件activity_main.xml <Line ...

  8. 北京U3D外包团队 UE4红军抗战案例 Unity3D红军抗战案例 UE4下载和安装虚幻4游戏引擎

    刚完整UE4红军抗战案例 Unity3D红军抗战案例,有在线演示(版权关系不方便发图),有UE4或Unity项目定制外包开发的欢迎联系我们 进入虚幻4的官方主页(https://www.unreale ...

  9. Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.

    1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...

  10. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写

    摘要:本文将系统介绍在GaussDB(DWS)系统中影响性能的坏味道SQL及SQL模式,帮助大家能够从原理层面尽快识别这些坏味道SQL,在调优过程中及时发现问题,进行整改. 数据库的应用中,充斥着坏味 ...

随机推荐

  1. Linux实现双击自动安装deb文件

    在Linux中,有几个常用的软件可以实现双击自动安装.deb文件的功能.以下是一些推荐的软件: 1. GDebi:GDebi是一个轻量级的图形化工具,专门用于安装.deb文件.它可以解决依赖关系,并提 ...

  2. 快速掌握Vue3:速成Vue3前端开发看这篇就够啦

    一.Vue基本概念 1.1-Vue3的优点 Vue3支持Vue2额大多数特性. 更好的支持TypeScript. 打包大小减少41%. 初次渲染快55%,更新渲染快133%. 内存减少54%. 使用p ...

  3. uniapp开发H5,分享链接到微信好友,显示标题和缩略图

    本文档介绍了如何在UniApp开发中实现将链接分享到微信好友,并确保在分享时显示标题和缩略图的方法. 背景 第一次用uniapp开发H5页面,发现分享给微信好友的链接,不显示标题和缩略图 步骤一:安装 ...

  4. [linux]frp内网穿透

    前言 假设有如下网络拓扑 A可以访问B,但B无法访问A.A和B都能访问C.如果B需要访问A的8000端口,一般有如下方法: 网络管理员做路由转发.硬件层面网络转发,性能一般来说更好,但需要熟悉路由配置 ...

  5. 不想引入mq?试试debezium

    有句话叫做"如无必要,勿增实体". 在一些小型项目当中,没有引入消息中间件,也不想引入,但有一些业务逻辑想要解耦异步,那怎么办呢? 我们的web项目,单独内网部署,由于大数据背景, ...

  6. SNAT与DNAT原理及应用

    SNAT与DNAT原理及应用 当内部地址要访问公网上的服务时(如httpd访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网 ...

  7. Unity UGUI的Toggle(复选框)组件的介绍及使用

    Unity UGUI的Toggle(复选框)组件的介绍及使用 1. 什么是Toggle组件? Toggle(复选框)是Unity UGUI中的一个常用组件,用于实现复选框的功能.它可以被选中或取消选中 ...

  8. 浅谈API安全的应用

    ​ 理论基础 API它的全称是Application Programming Interface,也叫做应用程序接口,它定义了软件之间的数据交互方式.功能类型.随着互联网的普及和发展,API 从早期的 ...

  9. QA|requests接口请求失败而postman请求成功原因排查|Requests

    requests接口请求失败而postman请求成功原因 代码如下 1 def ihrm_login(login_data, url1): 2 """login_data ...

  10. TIKZ全局样式设置

    tikz绘图引擎 TIKZ绘图引擎是基于tex实现,代码极其复杂,每次编写都要单独设置样式,甚是繁琐,如何能够全局设置呢? \begin{tikzpicture}[ auto, % 决策结点 deci ...