我在Oracle pl / sql上有一个分层表。类似的东西:
create table hierarchical (
id integer primary key,
parent_id references hierarchical ,
name varchar(100));
我需要创建一个更改该表的过程,以便我得到一个新字段,告诉每个节点它是否有子节点。
是否可以在一个程序中进行更改和更新? 任何代码示例都将非常感激。
由于
答案 0 :(得分:2)
您无法一步完成ALTER TABLE
(DDL)和UPDATE
(DML)。
您必须执行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伪列来获得确切数量的孩子,但我不确定。