递归公用表达式(子查询因子化)查询父代或子代(层次结构)
来源:互联网 发布:淘宝直播怎么做 编辑:程序博客网 时间:2024/04/28 18:27
就是一道遇到的面试题,其实很简单。只是当时可能相对比较紧张没有好好写出来。
查询某个节点的子代
为了方便我借用Oracle中的Scott模式下的emp表
下图显示了人员信息层次结构
WITH CTE(EmpNo,Mgr,EName,LVL)AS(SELECT EmpNo,Mgr,EName,0 LVLFROM Scott.EmpWHERE Mgr IS NULLUNION ALLSELECT t.empno,t.mgr,t.ename,t1.LVL+1 LVLFROM Scott.Emp tINNER JOIN CTE t1 ON t.mgr=t1.EmpNo)SEARCH DEPTH FIRST BY EmpNo SET ORDER1SELECT LPAD(' ',LVL*2,' ')||EName EName,LVL,EmpNO,Mgr FROM CTE;
当时我就一直想怎么利用这个CTE再来查询出一个人员的子代呢,实现没有简单(一个语句)方法实现,最后放弃了。
回来以后想想其实就是当时的惯性思维写这个把整个的人员层次结构都查出来,那要查询某个人子代,不是就某个人层次结构了么(改了加粗与斜体的地方)
WITH CTE(EmpNo,Mgr,EName,LVL)AS(SELECT EmpNo,Mgr,EName,0 LVLFROM Scott.Emp***WHERE EName='JONES'***UNION ALLSELECT t.empno,t.mgr,t.ename,t1.LVL+1 LVLFROM Scott.Emp tINNER JOIN CTE t1 ON t.mgr=t1.EmpNo)SEARCH DEPTH FIRST BY EmpNo SET ORDER1SELECT LPAD(' ',LVL*2,' ')||EName EName,LVL,EmpNO,Mgr FROM CTE;
检索某个节点的父代也就相对简单了(修改加粗处)
WITH CTE(EmpNo,Mgr,EName,LVL)AS(SELECT EmpNo,Mgr,EName,0 LVLFROM Scott.Emp**WHERE EName='SMITH'**UNION ALLSELECT t.empno,t.mgr,t.ename,t1.LVL+1 LVLFROM Scott.Emp t**INNER JOIN CTE t1 ON t.empno=t1.Mgr**)SEARCH DEPTH FIRST BY EmpNo SET ORDER1SELECT LPAD(' ',LVL*2,' ')||EName EName,LVL,EmpNO,Mgr FROM CTE;
上面显示格式没有进行调整,是从子代向父代(从上向下)。根据需要重新进行格式化设置。
0 0
- 递归公用表达式(子查询因子化)查询父代或子代(层次结构)
- connect by 递归子查询因子化
- 递归子查询因子化-CONNECT BY
- oracle递归子查询因子化
- CTE公用表达式实现递归查询
- oracle怎么处理父子关系(递归查询因子化)
- oracle 子查询因子化 浅谈(with的使用)
- 9.11 子查询因子化
- 使用公用表表达式的递归查询(CTE)
- Oracle递归查询(目录结构查询)
- Oracle层次化查询(递归查询)
- Mysql中的递归层次查询(父子查询)
- Mysql中的递归层次查询(父子查询)
- Mysql中的递归层次查询(父子查询)
- (递归查询)关于oracle树结构查询 展示 分组,查找父节点,查找子节点问题
- 【mysql 递归查询】Mysql中的递归层次查询(父子查询)
- MySQL递归层次查询
- MySql递归层次查询
- java使用Comparator与Comparable接口对对象排序
- Oracle EBS 高级定价中定价属性的定义过程
- Ubuntu 细碎
- zabbix客户端安装及配置
- cocos2d-C++ 学习UI控件(三)之 LoadingBar|ScrollView
- 递归公用表达式(子查询因子化)查询父代或子代(层次结构)
- Crosswalk入门
- 排序之堆排序
- arm-linux-gcc 交叉编译工具链安装
- Java中是传值还是传引用
- JavaScript弹出新窗口的方法
- HTTP协议基本认证
- 单元测试之道C#版
- Spring MVC 学习笔记 Viewresol和View