具有Connect BY内部连接和更新的树结构

时间:2012-09-27 13:00:27

标签: sql oracle join tree connect

我有3张桌子。 表TestFolderIteration

每个test都与Folder相关联。 与Folder相关联的test是许多其他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));

问题是Oracle不知道a.folder_id

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

有人知道解决问题或改进查询的更好方法吗?

例如,使用select * from and rownum = 1获取根文件夹?

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定我的数据库结构是否正确,但我希望无论如何我的想法都能帮到你。所以我建议提供有关数据库结构的更多信息,例如Iterations可以有多少Test

所以,这是我的建议:

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));

一般的想法是在子查询中展平层次结构,以便它可以很容易地加入。