关于connet by的学习
关于connet by的学习
今天,我学习了oracle 的connect by。搞了半天我才弄明白这个connect by的意思。
connect by的作用就是递归查询,什么意思呢,下面上实例来理解。
SQL> select level,ename,job ,ename from scott.emp emp start with ename in ('WARD') connect by empno = prior mgr;
LEVEL ENAME JOB ENAME
---------- ------------------------------ --------- ------------------------------
1 WARD SALESMAN WARD
2 BLAKE MANAGER BLAKE
3 KING PRESIDENT KING
解释:
/*START WITH 表示递归的起点,而 CONNECT BY 描述递归步骤,决定了爬树的方向, 也就是如何从第 n 步发展到第 (n + 1) 步。由于在归结 ename 时需要区分第 n 步和第 (n + 1) 步,因此使用 PRIOR (优先的意思)来表明 empno 属于第 n 步,而 mgr 属于第 (n + 1) 步。
先从start with ename=’WARD’这一行数据开始,因为prior 为mgr,那么第一步的mgr就是7698,其对应的empno也必须是7698,这样第二步就会输出7698即blake;7698对应的mgr是7839,所以这个mgr=7839将作为第三步的prior,而empno=7839其实就是king。以此类推。我们看到empno=7839即 king对应的mgr为空,那输出就到此结束。
其中的LEVEL是 伪列。这个列的作用是表明产生行的递归步骤 n 属于第几步。 在这个例子中,它表示领导与雇员之间相差的管理等级加 1(因为 LEVEL 一开始为 1)。
参考文档:
http://wenku.baidu.com/link?url=yFOQy8ARYvVLikTnD8CfA1OA9f9pwBRyAkNDjusRe3OU5o9ATAgYy2OWX5EcaOR_Q0xWvFLFO4YZgdO4EWTDJ9Oe_aPGMrozb9uLLumIE63
如果你读懂了上面的例子,那么就自己分析一下下面这个例子吧。
SQL> col ename for a30
SQL> select level,empno,lpad(ename,length(ename)+level*2-2,' ') ename
2 from emp
3 start with ename='KING'
4 connect by prior empno=mgr;
LEVEL EMPNO ENAME
---------- ---------- ------------------------------
1 7839 KING
2 7566 JONES
3 7788 SCOTT
4 7876 ADAMS
3 7902 FORD
4 7369 SMITH
2 7698 BLAKE
3 7499 ALLEN
3 7521 WARD
3 7654 MARTIN
3 7844 TURNER
LEVEL EMPNO ENAME
---------- ---------- ------------------------------
3 7900 JAMES
2 7782 CLARK
3 7934 MILLER
14 rows selected.
数据具有树状结构,就可以使用分级查询,如上面例子的领导下有员工、一级主管、二级主管、三级主管等 。
好了,既然上面两个小例子你都看懂了,那我们在看一下下面这个例子。
需求:输出某个月的所有日期。
解决办法:
select to_date('201504','yyyymm')+(rownum-1)
s_date from dual
connect by rownum<=last_day(to_date('201504','yyyymm')) - to_date('201504','yyyymm')+1;
S_DATE
-------------------
2015/04/01 00:00:00
2015/04/02 00:00:00
2015/04/03 00:00:00
2015/04/04 00:00:00
2015/04/05 00:00:00
2015/04/06 00:00:00
2015/04/07 00:00:00
2015/04/08 00:00:00
2015/04/09 00:00:00
2015/04/10 00:00:00
2015/04/11 00:00:00
S_DATE
-------------------
2015/04/12 00:00:00
2015/04/13 00:00:00
2015/04/14 00:00:00
2015/04/15 00:00:00
2015/04/16 00:00:00
2015/04/17 00:00:00
2015/04/18 00:00:00
2015/04/19 00:00:00
2015/04/20 00:00:00
2015/04/21 00:00:00
2015/04/22 00:00:00
S_DATE
-------------------
2015/04/23 00:00:00
2015/04/24 00:00:00
2015/04/25 00:00:00
2015/04/26 00:00:00
2015/04/27 00:00:00
2015/04/28 00:00:00
2015/04/29 00:00:00
2015/04/30 00:00:00
30 rows selected.
看到上面的SQL是不是有点懵?别急,我来一一分解。
下面这条语句可以输入每个自然月的第一天的日期。
下面这个SQL可以输出每个自然月的最后一天的日期:
下面两个SQL就是在输出一个月有多少天。
connect by是关键字,rownum是伪列, connect by rownum就是递归输出数字,因为connect by是会产生递增序列的。
SQL> select rownum from dual connect by rownum <10;
ROWNUM
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
好了,看了上面的分析,那你就很容易理解下面这条语句的含义了,就不多说了。
select to_date('201504','yyyymm')+(rownum-1)
s_date from dual
connect by rownum<=last_day(to_date('201504','yyyymm')) - to_date('201504','yyyymm')+1;
另外,连续输入数字还能这么做:
SQL> SELECT LEVEL
2 FROM dual
3 CONNECT BY LEVEL < 10;
LEVEL
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
简单的分页,用level,不能用rownum:
SQL> select level from dual where level between 10 and 20 connect by level<=20;
LEVEL
----------
10
11
12
13
14
15
16
17
18
19
20
11 rows selected
SQL> select rownum+10 from dual connect by rownum<11;
ROWNUM+10
----------
11
12
13
14
15
16
17
18
19
20
10 rows selected.
附件列表
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28916011/viewspace-1666140/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28916011/viewspace-1666140/
关于connet by的学习相关推荐
- QT学习杂项(1)--在connet函数里使用自定义类型
在connet函数里使用自定义类型时,需要在类的构造函数里注册一下,否则会提示XXXType未知大小. eg: 1.先在构造函数里注册:qRegisterMetaType<QVector& ...
- Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运 ...
- CCNP学习笔记(5)
一.IP地址的规划 1.路由器 ①端口 ②路由协议的network声明 ③控制列表 ④NAT ⑤DHCP ⑥路由过滤 ⑦静态路由(默认路由) 2.交换机 ①管理IP ②vlan通信 ③三层交换 ④访问 ...
- Node.JS 学习路线图
2019独角兽企业重金招聘Python工程师标准>>> 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框 ...
- TCP/IP协议学习(五) 基于C# Socket的C/S模型
TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...
- Linux开发学习笔记(二)
(温馨提示:内容有点多,可点右边的目录进行跳转) Shell编程 1.简单介绍 Shell 脚本(shell script),是一种为 shell 编写的脚本程序.Shell 编程跟 java.php ...
- python基础学习笔记——完结
文章目录 一. python概述 1.1 概述 1.2 优缺点 1.3 应用场景 二. python解释器和集成环境的安装 2.1. 编程语言分类 2.2 基本环境搭建 2.3 集成开发环境pycha ...
- 18、HTTP基本操作及源码编译安装 学习笔记
HTTPHyper Text Transfer Protocol超文本传输协议 HTMLHyper Text Mark-up Language超文本标记语言 URIUniform Resource I ...
- 《史上最全、最强Java学习路线知识点整理!!全是干货!!》
自己平时学习整理的笔记,分享给各位,希望可以帮助各位,文章很长,点击收藏慢慢看吧!以后会分别对各个知识点进行透彻分析,敬请期待! Java基础 集合 HashMap 1.7 数组 + 链表.扩容时头插 ...
最新文章
- Java 高并发面试题
- 编程珠玑第六章习题二——C++实现一个数的因子分解
- important的扯淡
- Python之创建单元素tuple
- 视频解码基础知识(二)
- python super 理解(四)
- ajax项目设置,jQuery_ajax预处理_和后置处理;项目中ajax自动设置_token_请求头,_接口响应code的统一处理...
- ​EMNLP 2021 | 以对比损失为微调目标,UMass提出更强大的短语表示模型
- Memcached----2-3
- c语言运行后出现xt073,2017年北京工业大学城市交通学院894C语言与数据结构之C程序设计考研强化模拟题...
- html只读下拉框,Html.DropDownList – 禁用/只读
- 5动态显示图片_单片机入门 数码管的静态显示和动态显示 壁纸
- 《区块链技术指南》摘要
- html5好看表格样式,CSS实现的清爽、漂亮的表格样式分享
- js判断数组中是否包含某个元素
- 用Hydra工具暴力破解Windows7管理员密码并访问它的共享服务
- 关于使用Python——写最佳体重测试
- win8 配置要求
- CAD二次开发--ZOOM自定义缩放到视口区域,解决SelectCrossingWindow等方法对视口外实体不起作用的问题
- php网页课程设报告,网页设计课程设计报告