2012-09-27 24 views
2

我有3個表。 表TestFolderIteration樹結構與連接BY內部加入和更新

testFolder掛鉤。 與test鏈接的Folder是許多其他folders的子碼。

從這些folders中,層次結構頂部的一個與表Iteration連接。

現在我想更新Test表Iteration_ID。這樣我就可以在Test和Iteration之間建立一個「快速」連接。 這是我的嘗試:

update Test a set a.Iteration_ID = 
(nvl((
--The Select Part 
select b.ID from Iteration b inner join Folder c on b.Folder_ID = c.ID 
    where c.ID = 
    (
     select * from 
     (
      SELECT d.ID FROM Folder d START WITH d.ID = 135196 CONNECT BY PRIOR d.parent_id = d.id 
      order by LEVEL desc 
     ) 
     where rownum= 1 
    ) 

--End Select Part 
),0)); 

查詢上述作品,但我在d.ID.靜態ID我想設置有a.Folder_ID

update Test a set a.Iteration_ID = 
(nvl((
--The Select Part 
select b.ID from Iteration b inner join Folder c on b.Folder_ID = c.ID 
    where c.ID = 
    (
     select * from 
     (
      SELECT d.ID FROM Folder d START WITH d.ID = a.Folder_ID CONNECT BY PRIOR d.parent_id = d.id 
      order by LEVEL desc 
     ) 
     where rownum= 1 
    ) 

--End Select Part 
),0)); 

的問題是,甲骨文不知道a.folder_id

ORA-00904: "A"."FOLDER_ID": ungültiger Bezeichner 
00904. 00000 - "%s: invalid identifier" 

任何人都知道一個更好的辦法來解決問題,或改善查詢?

例如要獲取根文件夾與我的select * from and rownum = 1

謝謝!

回答

0

我不確定我的DB結構是否正確,但我希望我的想法能夠幫助您解決這兩種情況。所以我建議提供更多關於DB結構的信息,例如Test有多少Iterations

所以,這裏是我的建議:

UPDATE test a set a.Iteration_ID = 
(nvl((
SELECT i.ID 
FROM Iteration i, 
    (SELECT id, first_value(id) over(partition by connect_by_root(id)) first_id 
    FROM Folder 
    START WITH parent_id IS NULL 
    CONNECT BY parent_id = PRIOR id) folder_flat 
WHERE a.TEST_ID = folder_flat.first_id 
    and i.Folder_ID = folder_flat.ID 
),0)); 

總體思路是扁平化層次結構中的子查詢,因此可以很容易地加入。