Sql 非标准化等级数据的更新

Sql 非标准化等级数据的更新,sql,oracle,hierarchy,Sql,Oracle,Hierarchy,我有一个包含三列的表:父、子和标志。当一个子项有自己的子项时,它也会出现在父项列中 层次结构没有标准化的级别,因此,一个成员可以将级别6作为最后一个级别,而另一个成员可以将其最后一个级别设置为3 例如: 1 - 1.1 -- 1.1.1 --- 1.1.1.1 - 1.2 -- 1.2.1 - 1.3 -- 1.3.1 --- 1.3.1.1 ----1.3.1.1.1 2 - 2.1 -- 2.1.1 ... 我需要的是更新父项以1开头的记录的标志,以及它的子项和子项的子项,等等。。。在这种

我有一个包含三列的表:父、子和标志。当一个子项有自己的子项时,它也会出现在父项列中

层次结构没有标准化的级别,因此,一个成员可以将级别6作为最后一个级别,而另一个成员可以将其最后一个级别设置为3

例如:

1
- 1.1
-- 1.1.1
--- 1.1.1.1
- 1.2
-- 1.2.1
- 1.3
-- 1.3.1
--- 1.3.1.1
----1.3.1.1.1
2
- 2.1
-- 2.1.1
...
我需要的是更新父项以1开头的记录的标志,以及它的子项和子项的子项,等等。。。在这种情况下,只有:

1
- 1.1
-- 1.1.1
--- 1.1.1.1
- 1.2
-- 1.2.1
- 1.3
-- 1.3.1
--- 1.3.1.1
----1.3.1.1.1
但请记住,表中的结构不是这样的,而是分为两列,如:

Parent    |Child
1          1.1
1          1.2
1          1.3
1.1        1.1.1
1.1.1      1.1.1.1
1.2        1.2.1
...

提前感谢大家

如果我理解您的问题,您希望更新第一个父行的行。 您可以通过
connectby\u root
look来实现这一点

基本上(没有测试过)是这样的

update  hierarchy_table h_outer
set     flag = 'X'
where   h_outer.rowid in (
    select rid 
    from    (
        select  h.row_id as rid , connect_by_root parent_id as root_parent
        from    hierarchy_table h
        start with parent = null 
        connect by prior child_id = parent_id
        ) 
    where root_parent like '1%'
    )

希望这能满足你的要求

UPDATE hierarchy_table a
   SET a.flag = 'X'
 WHERE a.ROWID IN (SELECT b.ROWID
                     FROM hierarchy_table b
                    START WITH b.PARENT = '1' -- Change start point here
                  CONNECT BY PRIOR b.child = b.PARENT);

其中
类子输入_parent_id | |'。%'
对您没有帮助?没有,因为层次结构不是这样组织的(这只是一个示例)。实际上,数据更像:(L1)CT-100000->(L2)CT-101022->(L3)CT-98009…我认为它正在生成笛卡尔坐标。听说过一种叫NOCYCLE的东西。。。也许这能帮上忙。。。我正在设置起点,但即使是查询也不会结束…只是想让您知道,层次结构并不像1,1.1那样组织。。。(这只是一个例子)。实际上数据更像:(L1)CT-100000->(L2)CT-101022->(L3)CT-98009…除非存在父子关系,否则数据是什么并不重要。这个查询在Oracle 11.0.0.1.0中非常适合我。此外,其解释计划没有显示任何笛卡尔坐标。但无论如何,这是一个很好的观点,最好提供别名。如果在某个时间点,父母的子女是先前的父母,而您的示例没有证明这一点,则需要NOCYCLE。