更改和更新层次关系表以查看是否有子项的过程

时间:2010-03-18 14:27:14

标签: oracle plsql hierarchical-data procedure alter

我在Oracle pl / sql上有一个分层表。类似的东西:

create table hierarchical (
   id             integer primary key,
   parent_id          references hierarchical ,
   name           varchar(100));

我需要创建一个更改该表的过程,以便我得到一个新字段,告诉每个节点它是否有子节点。

是否可以在一个程序中进行更改和更新? 任何代码示例都将非常感激。

由于

2 个答案:

答案 0 :(得分:2)

您无法一步完成ALTER TABLEDDL)和UPDATEDML)。

您必须执行ALTER TABLE,然后执行UPDATE

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
  --
  EXECUTE IMMEDIATE '
  UPDATE hierarchical h
  SET child_count = ( SELECT COUNT(*)
                      FROM hierarchical h2
                      WHERE h2.parent_id = h.id )';
END;

在此之前请三思而后行。如果id有任何查询的孩子,您可以轻松找到。

这个会给你所有顶级节点的子计数,例如:

SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name

添加带有冗余数据的额外列会使更改数据变得更加困难,因为在添加/删除子项时,您也必须更新父项。

答案 1 :(得分:0)

如果您只需要知道是否存在子项,则以下查询可以在没有循环或非规范化列的情况下执行此操作。

    select h.*, connect_by_isleaf as No_children_exist
      from hierarchical h
start with parent_id is null
connect by prior id = parent_id; 

如果行有子节点,则CONNECT_BY_LEAF返回0,否则返回1。

我认为你可以通过巧妙地使用分析函数和LEVEL伪列来获得确切数量的孩子,但我不确定。