在 Oracle 分层查询中放置 PRIOR 语句导致的差异
Difference caused by placement of PRIOR statement in an Oracle hierarchical query
使用 Connect By 时,您似乎可以在 Oracle 中执行以下两项操作。
CONNECT BY NOCYCLE
parent_id = PRIOR child_r_object_id
CONNECT BY NOCYCLE PRIOR
parent_id = child_r_object_id
有什么区别,网上大部分例子都倾向于使用第二种语法,但是两者都执行。
"prior"关键字父记录的字段。
例如这个
parent_id = PRIOR child_r_object_id
表示"child_r_object_id from parent record is equal to parent_id of child line"
PRIOR parent_id = child_r_object_id
意思正好相反——父记录的parent_id等于子记录的child_r_object_id
基本上您定义从上到下或从下到上构建层次结构。
查看此示例以了解不同之处:
WITH t(person, parent_id, ID) AS (
SELECT 'Grandma', NULL, 1 FROM dual
UNION ALL SELECT 'Mother', 1, 10 FROM dual
UNION ALL SELECT 'Daughter', 10, 100 FROM dual
UNION ALL SELECT 'Son', 10, 101 FROM dual)
SELECT person AS leaf_person, CONNECT_BY_ROOT(person) AS top_person,
SYS_CONNECT_BY_PATH(person, '->'), 'down' AS direction
FROM t
WHERE CONNECT_BY_ISLEAF = 1
START WITH parent_id IS NULL
CONNECT BY parent_id = PRIOR ID
UNION ALL
SELECT person as leaf_person, CONNECT_BY_ROOT(person) as top_person,
SYS_CONNECT_BY_PATH(person, '->'), 'up' AS direction
FROM t
WHERE CONNECT_BY_ISLEAF = 1
START WITH ID IN (100,101)
CONNECT BY PRIOR parent_id = ID;
+-----------------------------------------------------------------+
|LEAF_PERSON|TOP_PERSON|SYS_CONNECT_BY_PATH(PERSON,'->')|DIRECTION|
+-----------------------------------------------------------------+
|Daughter |Grandma |->Grandma->Mother->Daughter |down |
|Son |Grandma |->Grandma->Mother->Son |down |
|Grandma |Daughter |->Daughter->Mother->Grandma |up |
|Grandma |Son |->Son->Mother->Grandma |up |
+-----------------------------------------------------------------+
通常您只有一个根(即 parent_id IS NULL
)或至少确定根元素,因此大多数示例使用 "top-to-down" 方向。
使用 Connect By 时,您似乎可以在 Oracle 中执行以下两项操作。
CONNECT BY NOCYCLE
parent_id = PRIOR child_r_object_id
CONNECT BY NOCYCLE PRIOR
parent_id = child_r_object_id
有什么区别,网上大部分例子都倾向于使用第二种语法,但是两者都执行。
"prior"关键字父记录的字段。
例如这个
parent_id = PRIOR child_r_object_id
表示"child_r_object_id from parent record is equal to parent_id of child line"
PRIOR parent_id = child_r_object_id
意思正好相反——父记录的parent_id等于子记录的child_r_object_id
基本上您定义从上到下或从下到上构建层次结构。
查看此示例以了解不同之处:
WITH t(person, parent_id, ID) AS (
SELECT 'Grandma', NULL, 1 FROM dual
UNION ALL SELECT 'Mother', 1, 10 FROM dual
UNION ALL SELECT 'Daughter', 10, 100 FROM dual
UNION ALL SELECT 'Son', 10, 101 FROM dual)
SELECT person AS leaf_person, CONNECT_BY_ROOT(person) AS top_person,
SYS_CONNECT_BY_PATH(person, '->'), 'down' AS direction
FROM t
WHERE CONNECT_BY_ISLEAF = 1
START WITH parent_id IS NULL
CONNECT BY parent_id = PRIOR ID
UNION ALL
SELECT person as leaf_person, CONNECT_BY_ROOT(person) as top_person,
SYS_CONNECT_BY_PATH(person, '->'), 'up' AS direction
FROM t
WHERE CONNECT_BY_ISLEAF = 1
START WITH ID IN (100,101)
CONNECT BY PRIOR parent_id = ID;
+-----------------------------------------------------------------+
|LEAF_PERSON|TOP_PERSON|SYS_CONNECT_BY_PATH(PERSON,'->')|DIRECTION|
+-----------------------------------------------------------------+
|Daughter |Grandma |->Grandma->Mother->Daughter |down |
|Son |Grandma |->Grandma->Mother->Son |down |
|Grandma |Daughter |->Daughter->Mother->Grandma |up |
|Grandma |Son |->Son->Mother->Grandma |up |
+-----------------------------------------------------------------+
通常您只有一个根(即 parent_id IS NULL
)或至少确定根元素,因此大多数示例使用 "top-to-down" 方向。