2012-06-14 33 views
0

嗨,我有以下分層查詢。我可以知道如何在結果中包含pc.Parent =「abc」的開始?Oracle分層查詢:包括開始於結果和優化

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感謝

回答

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 
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 
+0

但孩子都爲之不是父母aka沒有孩子aka葉子將不在列表中。 – seesee

+0

不應該表現得那樣,嘗試了嗎?也許刪除NOCYCLE,因爲它不應該循環? – tvm

+0

從邏輯上講,它不應該工作,因爲一個孩子可能不是父母..例如葉 – seesee