0

您好我有以下分层查询。我可以知道如何在结果中包含以 pc.Parent="abc" 开头的吗?

select pc.child
from parentChild pc
start with pc.Parent="abc"
connect by nocycle prior pc.child = pc.parent;

我正在使用上面的查询来更新所有的孩子+从父值开始。

update person set ..... where person.id in (select pc.child
    from parentChild pc
    start with pc.Parent="abc"
    connect by nocycle prior pc.child = pc.parent)

我可以知道是否有更有效的方法来更新所有的孩子和自己?

我正在考虑取出子列表并使用休眠单独更新它们。

请分享您的建议 :D 谢谢

4

2 回答 2

3

对于第一个问题,使用SELECT pc.parent代替SELECT pc.child. 这样,即使是父级也将包含在结果中。

对于第二个问题(更新),我认为该查询没有任何问题。我以类似的方式使用 CONNECT BY PRIOR(为 IN 生成列表)并且从未遇到任何问题。事实上,我从未见过任何其他方法来更新 Oracle 上的树层次结构。

回应关于第一个问题的评论,(SQLDeveloper,10g):

CREATE TABLE mytree( parent_id INT, child_id INT );

INSERT INTO mytree VALUES ( 1, 2 );
INSERT INTO mytree VALUES ( 2, 3 );
INSERT INTO mytree VALUES ( 3, NULL );

SELECT 
lpad(' ', LEVEL)||parent_id
FROM
mytree
START WITH mytree.parent_id = 1
CONNECT BY PRIOR mytree.child_id = mytree.parent_id ;
1
 2
  3
于 2012-06-14T17:30:57.110 回答
0

不插入“父,空子”值的可能解决方案是使用对偶

select pc.child
from parentChild pc
start with pc.Parent="abc"
connect by nocycle prior pc.child = pc.parent
union
Select pc.parent from dual
于 2012-06-27T13:20:41.610 回答