小知识:Oracle中的层次查询
使用Oracle中的start with .. connect by prior ..语句可以轻松实现。
下面通过scott用户下的emp来做演示,使用自己的一个19c测试环境,结果发现默认并没有scott用户及其测试表,我们需要使用自带脚本添加:
@?/rdbms/admin/utlsampl.sql
发现脚本跑完没有显示报错,但也没有成功创建表,进一步排查发现因为是我们使用的是19c的一个PDB,脚本中的连接库方式默认没有指定,需要修改下。
我们先在tnsnames.ora配置文件中添加这个PDB的配置:
--配置tnsnames.ora
CMDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db19c-scan)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cmdb)
)
)
修正utlsampl.sql脚本中连接库方式,指定配置好的PDB:
...
CONNECT SCOTT/tiger@cmdb
...
再次执行,scott用户下面熟悉的测试表创建成功。
查询emp表:
SQL> conn scott/tiger@cmdb
Connected.
SQL> show pdbs
SP2-0382: The SHOW PDBS command is not available
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
利用层次查询中的伪列level和表达式sys_connect_by_path,查询如下:
select level, ename, job, sys_connect_by_path(ename,'->')
from emp
start with mgr is null
connect by prior empno = mgr
/
查询结果如下:
SQL> col sys_connect_by_path(ename,'->') for a35
SQL> /
LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
---------- ---------- --------- -----------------------------------
1 KING PRESIDENT ->KING
2 JONES MANAGER ->KING->JONES
3 SCOTT ANALYST ->KING->JONES->SCOTT
4 ADAMS CLERK ->KING->JONES->SCOTT->ADAMS
3 FORD ANALYST ->KING->JONES->FORD
4 SMITH CLERK ->KING->JONES->FORD->SMITH
2 BLAKE MANAGER ->KING->BLAKE
3 ALLEN SALESMAN ->KING->BLAKE->ALLEN
3 WARD SALESMAN ->KING->BLAKE->WARD
3 MARTIN SALESMAN ->KING->BLAKE->MARTIN
3 TURNER SALESMAN ->KING->BLAKE->TURNER
3 JAMES CLERK ->KING->BLAKE->JAMES
2 CLARK MANAGER ->KING->CLARK
3 MILLER CLERK ->KING->CLARK->MILLER
14 rows selected.
这样就通过start with .. connect by prior ..语句轻松的将这个层次关系查询出来,当然也可以根据需求进一步排序:
SQL> ed
Wrote file afiedt.buf
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* order by 1
SQL> /
LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
---------- ---------- --------- -----------------------------------
1 KING PRESIDENT ->KING
2 JONES MANAGER ->KING->JONES
2 BLAKE MANAGER ->KING->BLAKE
2 CLARK MANAGER ->KING->CLARK
3 FORD ANALYST ->KING->JONES->FORD
3 WARD SALESMAN ->KING->BLAKE->WARD
3 JAMES CLERK ->KING->BLAKE->JAMES
3 MILLER CLERK ->KING->CLARK->MILLER
3 ALLEN SALESMAN ->KING->BLAKE->ALLEN
3 SCOTT ANALYST ->KING->JONES->SCOTT
3 MARTIN SALESMAN ->KING->BLAKE->MARTIN
3 TURNER SALESMAN ->KING->BLAKE->TURNER
4 ADAMS CLERK ->KING->JONES->SCOTT->ADAMS
4 SMITH CLERK ->KING->JONES->FORD->SMITH
14 rows selected.
也可以指定关心的员工及其下属关系:
SQL> ed
Wrote file afiedt.buf
1 select level, ename, job, sys_connect_by_path(ename,'->')
2 from emp
3 start with ename = 'SCOTT'
4 connect by prior empno = mgr
5* order by 1
SQL> /
LEVEL ENAME JOB SYS_CONNECT_BY_PATH(ENAME,'->')
---------- ---------- --------- -----------------------------------
1 SCOTT ANALYST ->SCOTT
2 ADAMS CLERK ->SCOTT->ADAMS
第一次看到这类SQL时,总觉得语法很怪,但其实明白其实现的功能后,就会发现这种写法真是既简单又高效。
小知识:Oracle中的层次查询的更多相关文章
- Oracle中的层次查询详解
1 语法格式 select [level], column, expr... from table [where condition] start with condition connect by ...
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- oracle中使用sql查询时字段为空则赋值默认
转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...
- oracle中的连接查询与合并查询总结
连接查询: 连接查询是指基于多张表或视图的查询.使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积.如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积: (各 ...
- ORACLE中的TOP-N查询(TOP-N分析)、分页查询
TOP-N查询(TOP-N分析):就是获取某一数据集合中的前N条记录,实际应用中经常用到. Oracle中不支持SELECT TOP语句(MySQL中也没用此语句),需要借助ROWNUM伪列来实现TO ...
- Oracle中的一些查询语句及其执行顺序
查询条件: 1)LIKE:模糊查询,需要借助两个通配符,%:表示0到多个字符:_:标识单个字符. 2)IN(list):用来取出符合列表范围中的数据. 3)NOT IN(list): 取出不符合此列表 ...
- 常用oracle中系统表查询语句
sqlplus / as sysdbaSQL>select status from v$instance;1.查看最大连接数show parameter processes;2.查询oracle ...
- C# 与 Oracle 中 BINARY_DOUBLE数据类型查询
Oracle 10g新增 BINARY_DOUBLE 数据类型,而.NET暂不支持这个类型,查询时需要转换为 NUMBER. eg: "SELECT RAWTOHEX(OID) AS OID ...
- MVC中学到的小知识(MVC中的跳转,传参)
1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...
- oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。 – –如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。
一.思路:首先判断这个查询的是emp表,需要接收值,声明一个rowtype类型接收数据即可,第二是,存在exception,需要处理,exception中有两种异常,分别处理即可,分别输出即可. 二. ...
随机推荐
- 从“预见”到“遇见”SAE 引领应用步入 Serverless 全托管新时代
--黛忻 阿里云SAE产品经理 近年来,企业的数字化随着互联网的普及发展越来越快,技术架构也是几经更迭,尤其是在线业务部分.从最初的单体应用到分布式应用再到云原生应用,出现了进阶式的变化. 带来便利的 ...
- S3C2440移植uboot之支持NAND启动
上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动. 目录 1.去掉 "-pie ...
- HUD 5773 LIS(最长上升序列)
***关于lower_bound()的用法参见:http://blog.csdn.net/niushuai666/article/details/6734403 lower_bound用法:函数low ...
- MyBatis 系列:MyBatis 源码环境搭建
目录 一.环境准备 二.下载 MyBatis 源码和 MyBatis-Parent 源码 三.创建空项目.导入项目 四.编译 mybatis-parent 五.编译 mybatis 六.测试 总结 一 ...
- JavaScript合并多个数组
工作中经常会对数组进行合并,稍微总结一下常用的方法: concat JavaScript原生自带的函数,用法如下: let arr1 = [3, 5, 7]; let arr2 = [4, 78, 7 ...
- C:\Keil_v5\ARM\ARMCC\include\stdint.h contains an incorrect path.
1.问题 在使用Keil uvison5打开例程代码进行学习时,发现部分.h文件无法读取 2.解决方法 1.找到如图的设置按钮(小锤子) 2.根据自己所用的是C/C++还是ARM选择(我这里是C/C+ ...
- 结构体中ElementType的使用
1.问题 在定义结构体时,对于元素值,为什么喜欢使用ElementType而不是直接使用int或者char等等? 2.结论 对于int get_result(int x); 和 int get_res ...
- [转帖]oracle查询表变化量
根据变化量,可确定表的繁忙度,以及作为判断可能数据增长的对象. select obj.owner, obj.object_name, to_char(sn.BEGIN_INTERVAL_TIME,'y ...
- [转帖]TiKV & TiDB相关笔记
https://www.jianshu.com/p/1141be233bb2 一.TiKV存储 简述 通过单机的 RocksDB,TiKV 可以将数据快速地存储在磁盘上:通过 Raft,将数据复制到多 ...
- [转帖]超能课堂(323) 为什么WiFi实际速率只有标称速率的一半?
超能课堂(323) 为什么WiFi实际速率只有标称速率的一半? 开始的地方 协议速率与实际速率有何不同? 什么是"全双工"与"半双工"? 无线网络与有线网络的抗 ...