Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle分层查询中Previor语句的位置导致的差异_Sql_Oracle_Hierarchical - Fatal编程技术网

Sql Oracle分层查询中Previor语句的位置导致的差异

Sql Oracle分层查询中Previor语句的位置导致的差异,sql,oracle,hierarchical,Sql,Oracle,Hierarchical,在使用Connect By时,似乎可以在Oracle中同时执行以下两项操作 CONNECT BY NOCYCLE parent_id = PRIOR child_r_object_id CONNECT BY NOCYCLE PRIOR parent_id = child_r_object_id 区别在于,大多数在线示例倾向于使用第二种语法,但两者都执行。父记录的“preor”关键字What字段 比如这个 parent_id = PRIOR child_r_object

在使用Connect By时,似乎可以在Oracle中同时执行以下两项操作

 CONNECT BY NOCYCLE 
    parent_id = PRIOR child_r_object_id

 CONNECT BY NOCYCLE PRIOR 
    parent_id = child_r_object_id
区别在于,大多数在线示例倾向于使用第二种语法,但两者都执行。

父记录的“preor”关键字What字段

比如这个

parent_id = PRIOR child_r_object_id
表示“父记录中的子对象id等于子行的父对象id”


表示正好相反的-父记录的父对象id等于子记录的子对象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       |
+-----------------------------------------------------------------+

通常,您只有一个根(即
父\u id为NULL
),或者至少有确定的根元素,因此大多数示例使用“自上而下”“方向。

谢谢,您可以添加一个示例来说明如何添加一列来显示根节点的ID,即对于所有以grann作为根的行,应该有一列说明ID为1。然后,您可以使用它将employee表连接到此ID上的查询,以查看所有Grandmas子代。i、 例如,我假设我们可以有多个根节点,在我们的表中,我们有表示虚拟文档结构(如文件夹结构)的文档。同一级别上有许多根级别的文件夹/文档是的,您可能有多个根元素。使用外键约束时,将强制开始插入根元素。但是,一旦插入数据,您就可以在任意方向进行连接。在我们的表中,根节点连接到它自己—它是文档管理系统中的虚拟文档结构数据模型。我们需要处理这种情况,并手动删除这种伪造的关系,这似乎是一种将根文档标识到UI的方法。感谢您的回复。我总是这样低头one@smackenzie
connectbyprior key=parent\u key是自顶向下层次结构的标准方法。您也可以在另一个方向(自下而上)工作,在这种情况下,您可以交换
父键
。这与我假设的“按父项连接\u id=先前的子项\u 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       |
+-----------------------------------------------------------------+