SELECT 列表中的优先级
PRIOR in SELECT list
我不明白它向查询结果添加了什么。来自我正在学习的书:
If you prefix a column name with PRIOR in the
select list (SELECT PRIOR EMPLOYEE_ID, ...), you specify the “prior” row’s value.
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。
PRIOR
运算符 return 使用 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
这个简单的查询将行从根连接到叶。行的 parent 行的 VALUE
列的 PRIORVALUE
列 return 的值(层次结构中的前身),因此 'grand child 1' parent 是 'child 2' 或 'child 1' parent 是 'root'。 'root',层次结构中的第一行 (LEVEL = 1
) 没有任何 parent 因此 PRIOR
returns NULL
.
如果您以相反的方向连接层次结构,从叶到根,PRIOR
运算符将 return child 用于连接您所在行的行看着。
LEVEL 列显示层次结构中特定行的深度。
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"的名字。此值取自层次结构中的 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
我不明白它向查询结果添加了什么。来自我正在学习的书:
If you prefix a column name with PRIOR in the select list (SELECT PRIOR EMPLOYEE_ID, ...), you specify the “prior” row’s value.
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。
PRIOR
运算符 return 使用 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
这个简单的查询将行从根连接到叶。行的 parent 行的 VALUE
列的 PRIORVALUE
列 return 的值(层次结构中的前身),因此 'grand child 1' parent 是 'child 2' 或 'child 1' parent 是 'root'。 'root',层次结构中的第一行 (LEVEL = 1
) 没有任何 parent 因此 PRIOR
returns NULL
.
如果您以相反的方向连接层次结构,从叶到根,PRIOR
运算符将 return child 用于连接您所在行的行看着。
LEVEL 列显示层次结构中特定行的深度。
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"的名字。此值取自层次结构中的 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