Oracle分层查询:在结果和优化中包括Start With

时间:2012-06-14 16:56:07

标签: oracle hibernate

您好我有以下分层查询。我可以知道如何在结果中包含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)

我是否知道是否有更有效的方法来更新所有孩子及其自身?

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

请分享您的建议:D谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

没有插入“parent,null child”值的可能解决方案是使用双

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