使用Oracle中的start with .. connect by prior ..语句可以轻松实现。

下面通过scott用户下的emp来做演示,使用自己的一个19c测试环境,结果发现默认并没有scott用户及其测试表,我们需要使用自带脚本添加:

  1. @?/rdbms/admin/utlsampl.sql

发现脚本跑完没有显示报错,但也没有成功创建表,进一步排查发现因为是我们使用的是19c的一个PDB,脚本中的连接库方式默认没有指定,需要修改下。

我们先在tnsnames.ora配置文件中添加这个PDB的配置:

  1. --配置tnsnames.ora
  2. CMDB =
  3. (DESCRIPTION =
  4. (ADDRESS = (PROTOCOL = TCP)(HOST = db19c-scan)(PORT = 1521))
  5. (CONNECT_DATA =
  6. (SERVER = DEDICATED)
  7. (SERVICE_NAME = cmdb)
  8. )
  9. )

修正utlsampl.sql脚本中连接库方式,指定配置好的PDB:

  1. ...
  2. CONNECT SCOTT/tiger@cmdb
  3. ...

再次执行,scott用户下面熟悉的测试表创建成功。

查询emp表:

  1. SQL> conn scott/tiger@cmdb
  2. Connected.
  3. SQL> show pdbs
  4. SP2-0382: The SHOW PDBS command is not available
  5. SQL> select * from emp;
  6. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  7. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
  8. 7369 SMITH CLERK 7902 17-DEC-80 800 20
  9. 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
  10. 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
  11. 7566 JONES MANAGER 7839 02-APR-81 2975 20
  12. 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
  13. 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
  14. 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
  15. 7788 SCOTT ANALYST 7566 19-APR-87 3000 20
  16. 7839 KING PRESIDENT 17-NOV-81 5000 10
  17. 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
  18. 7876 ADAMS CLERK 7788 23-MAY-87 1100 20
  19. 7900 JAMES CLERK 7698 03-DEC-81 950 30
  20. 7902 FORD ANALYST 7566 03-DEC-81 3000 20
  21. 7934 MILLER CLERK 7782 23-JAN-82 1300 10
  22. 14 rows selected.

利用层次查询中的伪列level和表达式sys_connect_by_path,查询如下:

  1. select level, ename, job, sys_connect_by_path(ename,'->')
  2. from emp
  3. start with mgr is null
  4. connect by prior empno = mgr
  5. /

查询结果如下:

  1. SQL> col sys_connect_by_path(ename,'->') for a35
  2. SQL> /
  3. LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
  4. ---------- ---------- --------- -----------------------------------
  5. 1 KING PRESIDENT ->KING
  6. 2 JONES MANAGER ->KING->JONES
  7. 3 SCOTT ANALYST ->KING->JONES->SCOTT
  8. 4 ADAMS CLERK ->KING->JONES->SCOTT->ADAMS
  9. 3 FORD ANALYST ->KING->JONES->FORD
  10. 4 SMITH CLERK ->KING->JONES->FORD->SMITH
  11. 2 BLAKE MANAGER ->KING->BLAKE
  12. 3 ALLEN SALESMAN ->KING->BLAKE->ALLEN
  13. 3 WARD SALESMAN ->KING->BLAKE->WARD
  14. 3 MARTIN SALESMAN ->KING->BLAKE->MARTIN
  15. 3 TURNER SALESMAN ->KING->BLAKE->TURNER
  16. 3 JAMES CLERK ->KING->BLAKE->JAMES
  17. 2 CLARK MANAGER ->KING->CLARK
  18. 3 MILLER CLERK ->KING->CLARK->MILLER
  19. 14 rows selected.

这样就通过start with .. connect by prior ..语句轻松的将这个层次关系查询出来,当然也可以根据需求进一步排序:

  1. SQL> ed
  2. Wrote file afiedt.buf
  3. 1 select level, ename, job, sys_connect_by_path(ename,'->')
  4. 2 from emp
  5. 3 start with mgr is null
  6. 4 connect by prior empno = mgr
  7. 5* order by 1
  8. SQL> /
  9. LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
  10. ---------- ---------- --------- -----------------------------------
  11. 1 KING PRESIDENT ->KING
  12. 2 JONES MANAGER ->KING->JONES
  13. 2 BLAKE MANAGER ->KING->BLAKE
  14. 2 CLARK MANAGER ->KING->CLARK
  15. 3 FORD ANALYST ->KING->JONES->FORD
  16. 3 WARD SALESMAN ->KING->BLAKE->WARD
  17. 3 JAMES CLERK ->KING->BLAKE->JAMES
  18. 3 MILLER CLERK ->KING->CLARK->MILLER
  19. 3 ALLEN SALESMAN ->KING->BLAKE->ALLEN
  20. 3 SCOTT ANALYST ->KING->JONES->SCOTT
  21. 3 MARTIN SALESMAN ->KING->BLAKE->MARTIN
  22. 3 TURNER SALESMAN ->KING->BLAKE->TURNER
  23. 4 ADAMS CLERK ->KING->JONES->SCOTT->ADAMS
  24. 4 SMITH CLERK ->KING->JONES->FORD->SMITH
  25. 14 rows selected.

也可以指定关心的员工及其下属关系:

  1. SQL> ed
  2. Wrote file afiedt.buf
  3. 1 select level, ename, job, sys_connect_by_path(ename,'->')
  4. 2 from emp
  5. 3 start with ename = 'SCOTT'
  6. 4 connect by prior empno = mgr
  7. 5* order by 1
  8. SQL> /
  9. LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
  10. ---------- ---------- --------- -----------------------------------
  11. 1 SCOTT ANALYST ->SCOTT
  12. 2 ADAMS CLERK ->SCOTT->ADAMS

第一次看到这类SQL时,总觉得语法很怪,但其实明白其实现的功能后,就会发现这种写法真是既简单又高效。

小知识:Oracle中的层次查询的更多相关文章

  1. Oracle中的层次查询详解

    1 语法格式 select [level], column, expr... from table [where condition] start with condition connect by ...

  2. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  3. oracle中使用sql查询时字段为空则赋值默认

    转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...

  4. oracle中的连接查询与合并查询总结

    连接查询: 连接查询是指基于多张表或视图的查询.使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积.如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积:   (各 ...

  5. ORACLE中的TOP-N查询(TOP-N分析)、分页查询

    TOP-N查询(TOP-N分析):就是获取某一数据集合中的前N条记录,实际应用中经常用到. Oracle中不支持SELECT TOP语句(MySQL中也没用此语句),需要借助ROWNUM伪列来实现TO ...

  6. Oracle中的一些查询语句及其执行顺序

    查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...

  7. 常用oracle中系统表查询语句

    sqlplus / as sysdbaSQL>select status from v$instance;1.查看最大连接数show parameter processes;2.查询oracle ...

  8. C# 与 Oracle 中 BINARY_DOUBLE数据类型查询

    Oracle 10g新增 BINARY_DOUBLE 数据类型,而.NET暂不支持这个类型,查询时需要转换为 NUMBER. eg: "SELECT RAWTOHEX(OID) AS OID ...

  9. MVC中学到的小知识(MVC中的跳转,传参)

    1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...

  10. oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。 – –如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。

    一.思路:首先判断这个查询的是emp表,需要接收值,声明一个rowtype类型接收数据即可,第二是,存在exception,需要处理,exception中有两种异常,分别处理即可,分别输出即可. 二. ...

随机推荐

  1. java进阶(32)--Collections工具类

    一.简介:Collection与Collections区别 1.Java.until.Collection是集合接口 2.Java.until.Collections是集合工具类,方便集合的操作 二. ...

  2. 15-Verilog Coding Style

    Verilog Coding Style 1.为什么需要Coding Style 可综合性 - 代码需要综合成网表,如果写了一些不可综合的代码,会出现错误 可读性,代码通常有多个版本,所以需要保证代码 ...

  3. 【收集】embed

    序 链接 备注 1 适用于嵌入式单片机的差分升级通用库+详细教程_风吹花中花吹风的博客-CSDN博客 差分升级包制作与还原 2 前言 · 给新手的两轮自平衡小车开发实战指南 (miaowlabs.co ...

  4. [javaee] - tomcat 下载和配置环境变量

    以tomcat9为例 第一步 :下载到本地并解压文件 解压后: 第二步:配置环境变量,在系统变量中添加  CATALINE_HOME  ,路径为tomcat的目录 启动tomcat , 启动之后不要关 ...

  5. MySQL高可用搭建方案之(MMM)

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 注意:这篇转载文章,非原创 首发博客地址 原文地址 前言 MySQL的高可用 ...

  6. [转帖]ssd/san/sas/磁盘/光纤/RAID性能比较

    https://plantegg.github.io/2022/01/25/ssd_san%E5%92%8Csas%E7%A3%81%E7%9B%98%E6%80%A7%E8%83%BD%E6%AF% ...

  7. [转帖] JVM诊断命令jcmd介绍

    https://www.cnblogs.com/codelogs/p/16535451.html 简介# 从JDK7开始,jdk提供了一个方便扩展的诊断命令jcmd,用来取代之前比较分散的jdk基础命 ...

  8. ChatGPT 提高工作效率-一例SQL编写的过程

    ChatGPT 提高工作效率-一例SQL编写的过程 前言 遇到一个问题, 怀疑是有一些补丁没有被依赖. 导致第一次更新时没有更新这些没依赖的补丁. 后面更新时又更新了这些游离态的补丁. 导致出现 ol ...

  9. 【转贴】2019.3 学习向SP打造指南 篇一:微软神器Surface产品线全系列详细介绍

    学习向SP打造指南 篇一:微软神器Surface产品线全系列详细介绍 2019-03-01 22:30:00 161点赞 699收藏 141评论 https://post.smzdm.com/p/a5 ...

  10. 【解决了一个小问题】macbook m2 下交叉编译 musl-gcc 支持的 gozstd 库

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我的 golang 项目中使用了 gozstd, 在 ma ...