没错,又是京华的开发老哥,这次找我问个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. 【题解】Educational Codeforces Round 150(CF1841)

    赛时过了 A-E,然后就开摆了,为什么感觉 C 那么无厘头[发怒][发怒] 排名:25th A.Game with Board 题目描述: Alice 和 Bob 玩游戏,他们有一块黑板.最初,有 \ ...

  2. 网关冗余协议:FHRP、HSRP(思科)、VRRP、GLBP

    参考链接: CHANNEL技术与网关冗余 VRRP和HSRP的区别

  3. Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?

    本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间 ...

  4. Pandas: title函数的作用

    代码演示 将首字母大写,其余小写 效果演示 参考链接 https://www.w3resource.com/pandas/series/series-str-title.php

  5. Go函数可以返回多个值

    1 package main 2 3 import "fmt" 4 5 func swap(x, y string) (string, string){ 6 return y,x ...

  6. NativeBuferring,一种零分配的数据类型[下篇]

    上文说到Unmanaged.BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unm ...

  7. 数据分析师如何用SQL解决业务问题?

    本文来自问答. 提问:数据分析人员需要掌握sql到什么程度? 请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同阶段会有不同的要求吗? 正 ...

  8. HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告

    听学长说这道题很ex,但是思路想到的话还是挺简单的. 可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线. 但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可. ...

  9. ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载

    一.ChatGPT生成markdown源代码 问: 我想做一份ChatGPT变现方法的PPT,请生成丰富的教学展示内容,因为生成PPT是需要MarkDown格式的,请您输出Markdown格式的内容 ...

  10. Ceph-部署

    Ceph规划 主机名 IP地址 角色 配置 ceph_controler 192.168.87.202 控制节点.MGR Centos7系统500G硬盘 ceph_node1 192.168.87.2 ...