在SELECT列表中

时间:2016-03-06 11:06:13

标签: sql oracle connect-by

我无法理解它为查询结果添加了什么。从我正在学习的书中:

  

如果您使用PRIOR前缀列名称   选择列表(SELECT PRIOR EMPLOYEE_ID,...),指定“先前”行的值。

SELECT PRIOR EMPLOYEE_ID, MANAGER_ID, LPAD(' ', LEVEL * 2) || EMPLOYEES.JOB_ID
  FROM EMPLOYEES
  START WITH EMPLOYEE_ID = 100
  CONNECT BY PRIOR EMPLOYEE_ID =  MANAGER_ID;

我看到的唯一区别是,它在第​​一行中添加了NULL值,并将员工的ID增加了1。

2 个答案:

答案 0 :(得分:3)

PRIOR只是从遍历的层次结构中的先前记录中获取记录 我认为解决它如何工作的最好方法是使用简单的层次结构:

create table qwerty(
   id int,
   name varchar2(100),
   parent_id int
);

insert all
into qwerty values( 1, 'Grandfather', null )
into qwerty values( 2, 'Father', 1 )
into qwerty values( 3, 'Son', 2 )
into qwerty values( 4, 'Grandson', 3 )
select 1234 from dual;

以下查询遍历上述层次结构:

select level, t.*
from qwerty t
start with name = 'Grandfather'
connect by prior id = parent_id

     LEVEL         ID NAME                  PARENT_ID
---------- ---------- -------------------- ----------
         1          1 Grandfather                     
         2          2 Father                        1 
         3          3 Son                           2 
         4          4 Grandson                      3 

如果我们在上面的查询中添加“PRIOR name”,则会显示“parent”的名称。此vaue取自层次结构中的prevoius记录(来自LEVEL-1)

select level, prior name as parent_name, t.*
from qwerty t
start with name = 'Grandfather'
connect by prior id = parent_id;

     LEVEL PARENT_NAME                  ID NAME                  PARENT_ID
---------- -------------------- ---------- -------------------- ----------
         1                               1 Grandfather                     
         2 Grandfather                   2 Father                        1 
         3 Father                        3 Son                           2 
         4 Son                           4 Grandson                      3 

答案 1 :(得分:0)

PRIOR运算符使用CONNECT BY子句在层次结构构建中返回先前的值。

WITH hierarchy(id, parent_id, value) AS (
    SELECT 1, NULL,          'root' FROM dual UNION ALL
    SELECT 2,    1,       'child 1' FROM dual UNION ALL
    SELECT 3,    1,       'child 2' FROM dual UNION ALL
    SELECT 4,    3, 'grand child 1' FROM dual
)
SELECT
    hierarchy.*, LEVEL depth, PRIOR value
FROM
    hierarchy
START WITH
    parent_id IS NULL
CONNECT BY
    PRIOR id = parent_id

这个简单的查询连接从root到leafs的行。 PRIORVALUE列返回行的父行(层次结构中的前任)的VALUE列的值,因此' grand child 1'父母是孩子2'或者'孩子1'父母是' root'。 ' root',层次结构中的第一行(LEVEL = 1)没有任何父级,因此PRIOR会返回NULL

如果以相反的方向连接层次结构,从叶子到根,PRIOR运算符将返回用于连接您正在查看的行的子行。

LEVEL列显示层次结构中特定行的深度。