-格式化分层数据,    -明白分层查询概念

上学目的

学习指标

    -精晓分层查询概念

    -精通分层查询概念

    -创立树形协会报告

    -创造树形组织报告

    -格式化分层数据

    -格式化分层数据

    -树形组织排除分支

    -树形协会排除分支

 

 

    分层查询

    分层查询

        语法

        语法

 SELECT [LEVEL],<column>,exper ...
        FROM <table_name>
        [WHERE condition(s)]
        START WITH condition(s)
        CONNECT BY PRIOR condition(s);
 SELECT [LEVEL],<column>,exper ...
        FROM <table_name>
        [WHERE condition(s)]
        START WITH condition(s)
        CONNECT BY PRIOR condition(s);

 

 

LEVEL关键字重回层次查询中的层级数

LEVEL关键字重返层次查询中的层级数

STA奥德赛T WITH 钦定层级起首的第一级

STA讴歌MDXT WITH 钦点层级先河的率先级

CONNECT BY P君越IO凯雷德 钦命父行和子行之间的关种类,此子句是层次查询必需的

CONNECT BY PEvoqueIOQashqai 钦定父行和子行之间的关联列,此子句是层次查询必需的

 

 

        知识点

        知识点

Oracle中start with…connect by prior子句用法 

Oracle中start with…connect by prior子句用法 

connect by 是结构化查询中用到的,其基本语法是: 

connect by 是结构化查询中用到的,其主干语法是: 

select … from tablename start with 条件1 

select … from tablename start with 条件1 

connect by 条件2 

connect by 条件2 

where 条件3;

where 条件3;

例:

例:

select * from table

select * from table

start with org_id = ‘HBHqfWGWPy’

start with org_id = ‘HBHqfWGWPy’

connect by prior org_id = parent_id;

connect by prior org_id = parent_id;

不难说来是将3个树状结构存款和储蓄在一张表里,比如二个表中存在五个字段: 

大约说来是将三个树状结构存款和储蓄在一张表里,比如一个表中存在多个字段: 

org_id,parent_id那么通过代表每一条记下的parent是哪个人,就足以形成三个树状结构。 

org_id,parent_id那么通过代表每一条记下的parent是何人,就能够形成多个树状结构。 

用上述语法的询问能够拿走那棵树的拥有记录。 

用上述语法的查询能够赢得那棵树的享有记录。 

其中:

其中:

标准1
是根结点的范围语句,当然能够放宽限制条件,以获取八个根结点,实际正是多棵树。 

原则1
是根结点的界定语句,当然能够放宽限制标准,以获取五个根结点,实际正是多棵树。 

条件2 是接连条件,其中用PEvoqueIO奔驰M级表示上一条记下,比如 CONNECT BY P陆风X8IOR
org_id = parent_id就是说上一条记下的org_id
是本条记下的parent_id,即本记录的老爸是上一条记下。 

规格2 是连接条件,个中用PCRUISERIO福睿斯表示上一条记下,比如 CONNECT BY PENVISIONIOR
org_id = parent_id正是说上一条记下的org_id
是本条记下的parent_id,即本记录的阿爸是上一条记下。 

规范3 是过滤条件,用于对回到的有所记录举行过滤。

标准化3 是过滤条件,用于对回到的兼具记录举办过滤。

简言之介绍如下:

简短介绍如下:

早扫描树结构表时,需求依此访问树结构的每种节点,三个节点只可以访问1回,其访问的步骤如下:

早扫描树结构表时,供给依此访问树结构的各种节点,二个节点只好访问2回,其访问的步子如下:

首先步:从根节点早先;

第二步:从根节点初始;

第2步:访问该节点;

第贰步:访问该节点;

其三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并施行第3步,不然执行第陆步;

其三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并施行第①步,否则执行第④步;

第肆步:若该节点为根节点,则做客截至,不然执行第④步;

第4步:若该节点为根节点,则做客结束,不然执行第4步;

第6步:再次来到到该节点的父节点,并实施第①手续。

第肆步:重返到该节点的父节点,并履行第壹步骤。

 

 

综上说述:扫描整个树结构的进度也正是中序遍历树的经过。

简单来说:扫描整个树结构的长河也便是中序遍历树的进程。

 

 

1. 树结构的描述

1. 树结构的叙述

树结构的多少存放在表中,数据里面包车型大巴层次关系即父子关系,通过表中的列与列间的涉嫌来讲述,如EMP表中的EMPNO和MG安德拉。EMPNO表示该雇员的号子,MG途达代表监护人该雇员的人的数码,即子节点的MG奥德赛值等于父节点的EMPNO值。在表的每一行中都有3个意味父节点的MG福特Explorer(除根节点外),通过种种节点的父节点,就足以分明整个树结构。

树结构的数据存放在表中,数据里面的层次关系即父子关系,通过表中的列与列间的涉嫌来叙述,如EMP表中的EMPNO和MG中华V。EMPNO表示该雇员的号子,MG福睿斯代表理事该雇员的人的数码,即子节点的MGXC60值等于父节点的EMPNO值。在表的每一行中都有2个意味父节点的MGOdyssey(除根节点外),通过种种节点的父节点,就足以分明整个树结构。

在SELECT命令中选用CONNECT BY 和蔼STA奇骏T WITH
子句能够查询表中的树型结构涉及。其命令格式如下:

在SELECT命令中接纳CONNECT BY 和蔼STAQX56T WITH
子句能够查询表中的树型结构涉及。其命令格式如下:

SELECT 。。。

SELECT 。。。

CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}

CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}

[START WITH];

[START WITH];

内部:CONNECT
BY子句表达每行数据将是按层次顺序检索,并规定将表中的数量连入树型结构的涉嫌中。P牧马人IOPAJEROY运算符必须放置在再三再四关系的两列中某一个的前边。对于节点间的父子关系,PSportageIO普拉多运算符在一旁表示父节点,在另一侧表示子节点,从而分明查找树结构是的逐一是自顶向下或然自底向上。在三番6次关系中,除了能够行使列名外,还允许行使列表明式。STA翼虎T
WITH
子句为可选择,用来标识哪个节点作为查找树型结构的根节点。若该子句被简单,则代表全体满意查询条件的行作为根节点。

在这之中:CONNECT
BY子句表达每行数据将是按层次顺序检索,并鲜明将表中的数码连入树型结构的关联中。PEscortIOPRADOY运算符必须放置在连接关系的两列中某贰个的先头。对于节点间的父子关系,PCRUISERIOCR-V运算符在边上表示父节点,在另一侧表示子节点,从而鲜明查找树结构是的次第是自顶向下只怕自底向上。在接连关系中,除了能够采取列名外,还同意使用列说明式。STA福特ExplorerT
WITH
子句为可挑选,用来标识哪个节点作为查找树型结构的根节点。若该子句被总结,则表示全部满意查询条件的行作为根节点。

STAMuranoT WITH: 不但能够钦赐一个根节点,仍是能够钦命多少个根节点。

STA卡宴T WITH: 不但能够钦命二个根节点,还足以钦赐八个根节点。

2. 关于PRIOR

2. 关于PRIOR

运算符PQashqaiIO奥德赛被停放于等号前后的位置,决定着询问时的搜索顺序。

运算符PTiguanIOPRADO被放置于等号前后的岗位,决定着询问时的查找顺序。

PRAV4IOCRUISER被安放CONNECT
BY子句中等号的近期时,则强制从根节点到叶节点的逐条检索,即由父节点向子节点方向通过树结构,我们称为自顶向下的措施。如:

PCR-VIORAV4被放置CONNECT
BY子句中等号的前面时,则强制从根节点到叶节点的逐条检索,即由父节点向子节点方向通过树结构,大家称为自顶向下的主意。如:

CONNECT BY PRIOR EMPNO=MGR

CONNECT BY PRIOR EMPNO=MGR

PIRO汉兰达运算符被放置CONNECT BY
子句中等号的前面时,则强制从叶节点到根节点的逐条检索,即由子节点向父节点方向通过树结构,大家称为自底向上的法子。例如:

PIRO冠道运算符被停放CONNECT BY
子句中等号的背后时,则强制从叶节点到根节点的各类检索,即由子节点向父节点方向通过树结构,大家誉为自底向上的艺术。例如:

CONNECT BY EMPNO=PRIOR MGR

CONNECT BY EMPNO=PRIOR MGR

在那种艺术中也应钦定一个早先的节点。

在那种办法中也应钦赐3个起来的节点。

3. 概念查找初阶节点

3. 概念查找起头节点

在自顶向下询问树结构时,不但能够从根节点开端,还足以定义任何节点为发端节点,以此初始向下搜寻。这样查找的结果就是以该节点为伊始的结构树的一枝。

在自顶向下询问树结构时,不但能够从根节点先河,还能定义任何节点为初阶节点,以此伊始向下搜寻。那样查找的结果正是以该节点为发端的结构树的一枝。

4.使用LEVEL

4.使用LEVEL

在拥有树结构的表中,每一行数据都以树结构中的1个节点,由于节点所处的层系地点差异,所以每行记录都得以有二个层号。层号依照节点与根节点的离开明确。不论从哪些节点开端,该初步根节点的层号始终为1,根节点的子节点为2,
依此类推。图1.2就代表了树结构的层系。

在拥有树结构的表中,每一行数据都以树结构中的3个节点,由于节点所处的层次地点分化,所以每行记录都能够有1个层号。层号依照节点与根节点的离开显明。不论从哪些节点开头,该开端根节点的层号始终为1,根节点的子节点为2,
依此类推。图1.2就象征了树结构的层系。

5.节点和分层的剪裁

5.节点和支行的剪裁

在对树结构进行查询时,能够去掉表中的某个行,也得以剪掉树中的3个分段,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

在对树结构举办询问时,能够去掉表中的某个行,也能够剪掉树中的三个分层,使用WHERE子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后裔节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

6.排序突显

6.排序展现

象在其余查询中一样,在树结构查询中也能够使用O福特ExplorerDE帕杰罗 BY
子句,改变查询结果的显得顺序,而不用根据遍历树结构的顺序。

象在别的查询中一样,在树结构查询中也能够动用OLANDDELAND BY
子句,改变查询结果的显示顺序,而无需根据遍历树结构的依次。

 

 

 

 

例子:

例子:

 HR@cqoraxt0>select last_name,employee_id,manager_id,level from employees
start with employee_id =100
connect by prior employee_id=manager_id ;
LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Wendy                        204        200          3
Xi                           205        200          3
Tinan                        206        200          3
Ling                         207        200          3
Klec                         300        100          2
Owen                         301        300          3
Yi                           302        300          3

注意:connect by prior链接顺序

HR@cqoraxt0>
select last_name,employee_id,manager_id,level from employees
start with employee_id =302
connect by prior manager_id=employee_id
order siblings by last_name;
LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Yi                           302        300          1
Klec                         300        100          2
Dereck                       100          1          3
 HR@cqoraxt0>select last_name,employee_id,manager_id,level from employees
start with employee_id =100
connect by prior employee_id=manager_id ;
LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Wendy                        204        200          3
Xi                           205        200          3
Tinan                        206        200          3
Ling                         207        200          3
Klec                         300        100          2
Owen                         301        300          3
Yi                           302        300          3

注意:connect by prior链接顺序

HR@cqoraxt0>
select last_name,employee_id,manager_id,level from employees
start with employee_id =302
connect by prior manager_id=employee_id
order siblings by last_name;
LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Yi                           302        300          1
Klec                         300        100          2
Dereck                       100          1          3

 

 

    格式化层次查询

    格式化层次查询

        实现指标,采纳层次查询自动缩进

        落成目的,选取层次查询自动缩进

          

          

HR@cqoraxt0>col last_name format a20
select lpad(last_name,length(last_name)+level,' ') last_name,employee_id,manager_id from employees
start with employee_id =100
connect by prior employee_id=manager_id;

LAST_NAME            EMPLOYEE_ID MANAGER_ID
-------------------- ----------- ----------
Dereck                      100          1
  Gary                       200        100
   Gaga                      203        200
   Wendy                     204        200
   Xi                        205        200
   Tinan                     206        200
   Ling                      207        200
  Klec                       300        100
   Owen                      301        300
   Yi                        302        300

HR@cqoraxt0>select lpad(last_name,length(last_name)+level,'-') last_name,employee_id,manager_id from employees
start with employee_id =100
connect by prior employee_id=manager_id;

LAST_NAME            EMPLOYEE_ID MANAGER_ID
-------------------- ----------- ----------
-Dereck                      100          1
--Gary                       200        100
---Gaga                      203        200
---Wendy                     204        200
---Xi                        205        200
---Tinan                     206        200
---Ling                      207        200
--Klec                       300        100
---Owen                      301        300
---Yi                        302        300
10 rows selected.
HR@cqoraxt0>col last_name format a20
select lpad(last_name,length(last_name)+level,' ') last_name,employee_id,manager_id from employees
start with employee_id =100
connect by prior employee_id=manager_id;

LAST_NAME            EMPLOYEE_ID MANAGER_ID
-------------------- ----------- ----------
Dereck                      100          1
  Gary                       200        100
   Gaga                      203        200
   Wendy                     204        200
   Xi                        205        200
   Tinan                     206        200
   Ling                      207        200
  Klec                       300        100
   Owen                      301        300
   Yi                        302        300

HR@cqoraxt0>select lpad(last_name,length(last_name)+level,'-') last_name,employee_id,manager_id from employees
start with employee_id =100
connect by prior employee_id=manager_id;

LAST_NAME            EMPLOYEE_ID MANAGER_ID
-------------------- ----------- ----------
-Dereck                      100          1
--Gary                       200        100
---Gaga                      203        200
---Wendy                     204        200
---Xi                        205        200
---Tinan                     206        200
---Ling                      207        200
--Klec                       300        100
---Owen                      301        300
---Yi                        302        300
10 rows selected.

    排除分支

    排除分支

            方式一:

            方式一:

                    WHERE condition –排除钦定分支单个节点

                    WHERE condition –排除钦赐分支单个节点

                     START WITH

                     START WITH

                      CONNECT BY PRIOR

                      CONNECT BY PRIOR

            方式二:

            方式二:

                    START WITH

                    START WITH

                    CONNECT BY PRIOR

                    CONNECT BY PRIOR

                    AND condition –排除分支

                    AND condition –排除分支

            注意:格局叁头会去掉单个节点,它上边包车型地铁隶属分支不会去掉。   

            注意:格局2头会免去单个节点,它上边包车型大巴隶属分支不会去掉。   

 

 

            例子一

            例子一

            

            

HR@cqoraxt0>
select last_name,employee_id,manager_id,level from employees
where employee_id !=300
start with employee_id =100
connect by prior employee_id=manager_id
order siblings by last_name;

LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Ling                         207        200          3
Tinan                        206        200          3
Wendy                        204        200          3
Xi                           205        200          3
Owen                         301        300          3
Yi                           302        300          3
9 rows selected.
HR@cqoraxt0>
select last_name,employee_id,manager_id,level from employees
where employee_id !=300
start with employee_id =100
connect by prior employee_id=manager_id
order siblings by last_name;

LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Ling                         207        200          3
Tinan                        206        200          3
Wendy                        204        200          3
Xi                           205        200          3
Owen                         301        300          3
Yi                           302        300          3
9 rows selected.

        例子二

        例子二

         

         

 

 

   HR@cqoraxt0>select last_name,employee_id,manager_id,level from employees
            start with employee_id =100
            connect by prior employee_id=manager_id
            and employee_id !=300
            order siblings by last_name;

LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Ling                         207        200          3
Tinan                        206        200          3
Wendy                        204        200          3
Xi                           205        200          3

7 rows selected.
   HR@cqoraxt0>select last_name,employee_id,manager_id,level from employees
            start with employee_id =100
            connect by prior employee_id=manager_id
            and employee_id !=300
            order siblings by last_name;

LAST_NAME            EMPLOYEE_ID MANAGER_ID      LEVEL
-------------------- ----------- ---------- ----------
Dereck                       100          1          1
Gary                         200        100          2
Gaga                         203        200          3
Ling                         207        200          3
Tinan                        206        200          3
Wendy                        204        200          3
Xi                           205        200          3

7 rows selected.

读书计算:

学学总计:

        1.层次查询概念和动用办法

        1.层次查询概念和应用办法

        2.层次查询start with、connect by prior子句和level伪列含义

        2.层次查询start with、connect by prior子句和level伪列含义

        3.经过level伪列对层次查询数据实行格式化

        3.通过level伪列对层次查询数据开始展览格式化

        4.去掉层次查询单个节点和支行

        4.消除层次查询单个节点和支行

 

 

相关文章