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ます。このようにして、親も結果に含まれます。

2 番目の質問 (更新) については、そのクエリに問題はありません。同様の方法で(INのリストを生成するために)CONNECT BY PRIORを使用していますが、問題はありませんでした。実際、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

「親、nullの子」値を挿入せずに可能な解決策は、デュアルを使用することです

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 に答える