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