更新非标准化层次结构数据

时间:2014-01-16 13:52:02

标签: sql oracle hierarchy

我有一个包含三列的表:Parent,Child和Flag。当一个Child拥有自己的Children时,它也会出现在Parent列中。

层次结构没有标准化级别,因此,成员可以将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
...

我需要的是更新Parent以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
...

提前感谢所有人!

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你想要通过他们的第一个父母更新行。 你可以connect_by_roothere

基本上(没有测试过)类似的东西

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%'
    )

答案 1 :(得分: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);