SQL学习(⼆)分级检索查询
SQL学习(⼆)分级检索查询
前⾔
分级检索查询(Hierarchical Retrieval)也就是我们写报表时采⽤的树形结构查询。虽然⼤家平时也在使⽤,但我发现其实⼤部分同事都是依葫画瓢,真正理解得不多。接下来我们我们就从语法系统学习下分级检索查询相关知识。
基本语法
分级检索查询的基本语法如下:
SELECT [LEVEL], column,
FROM  table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)] ;
其中语法中重要的关键字就是 START WITH 和 CONNECT BY PRIOR。
START WITH 定义分级查询的起点
CONNECT BY PRIOR 定义了分级查询的条件,是从上往下查询还是从下往上查询。
语句书写
例表
为了⽅便的说明,我以部门表为例,表结构和数据源如下:
其树形结构如图所⽰:
起始点和查询顺序
1.⾸先是起始点,这个是通过start with 定义,如:
start with 上级id  is null
或者
start with id=0
2.其次是确定显⽰顺序,是从上到下,还是从下到上,这个是通过CONNECT BY PRIOR 定义。
如果我们要从上到下,那条件应该是
CONNECT BY PRIOR  id=上级id
这⾥我们对其进⾏下讲解,CONNECT BY PRIOR 是如何判断顺序的,其语法⼀般为:
CONNECT BY PRIOR column1 = column2
其中column1代表起始点数据源对应的字段,如上⾯的id,代表起始点数据源id, column2代表连接数据源的字段,例⼦中代表要连接字段的上级id,说得⽐较复杂,我们还是⽤举例来直观的说明吧。
举个sql实际的例⼦:
select id,上级id,编码,名称
from 部门表
Start With Id=4
Connect By Prior    Id    =      上级Id
(起始数据源对应:id=4)      (连接的字段)
可以看到,起始点是辅助科室(id=4,上级id=0),顺序是从上到下,显⽰其以下的所有科室(车库,财务科,结账室等)
select id,上级id,编码,名称
from 部门表
Start With Id=4    Connect By Prior    上级Id    =      Id
(起始数据源上级id=0)    (对应连接字段id)
级数(LEVEL)
通过上⾯的例⼦,我们可以看到,虽然已经查询出想要的结果,但是如果不仔细看,可能不容易看出起始点,如果我们想⼀⽬了然的看到结果,那我们就需要level这个伪列,现在我们加上这个伪列在看
下刚才执⾏结果。
select level,id,上级id,编码,名称
from 部门表
Start With Id=4
Connect By Prior    Id    =      上级Id
select level,id,上级id,编码,名称
sql容易学吗from 部门表
Start With Id=4
Connect By Prior    上级Id    =      Id
限制条件
我们在上⾯的例1中看到,level等级有3个,⽤图表⽰如下:
现在如果想只统计到level 2,我们举2种情况的例⼦,如下图:
通过分析,我们可以看到,情况1中,我们不需要提取财务室后的科室,也就是在财务室这⾥,查询就断掉,只需要加⼀个条件:名称<>’财务科’,我们来执⾏下看。
select level,id,上级id,编码,名称    from部门表    Start With Id=4    Connect By Prior    Id    =      上级Id    And  名称<>'财务科'
如果要实现情况 2,那我们只需要加个条件:level<=2就可以实现。
select level,id,上级id,编码,名称
from部门表
Start With Id=4    Connect By Prior    Id    =      上级Id
And  Level<=2
上⾯的语句,我们也可以⽤where条件进⾏限制,语句如下,效果是⼀样的。
select level,id,上级id,编码,名称
from部门表
where  Level<=2
Start With Id=4    Connect By Prior    Id    =      上级Id
结语
通过本章的学习,我想⼤家⾄少应该掌握以下⼏点:了解分级检索查询的概念;知道了如何定义起点和查询顺序;最后如何通过限制条件查出想要的结果。通过介绍,希望能对以后⼤家⼯作中书写报表有所帮助。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。