2

我有 3 张桌子。表和。Test_FolderIteration

每个test都与一个Folder. Folder与 相关的是test许多其他 的子folders

从这些folders层次结构顶部的一个与表相关联Iteration

现在我想更新表中的Iteration_IDTest。这样我就有了测试和迭代之间的“快速”连接。这是我的尝试:

    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?

谢谢!

4

1 回答 1

0

我不确定我的数据库结构是否正确,但我希望我的想法在任何一种情况下都能对你有所帮助。所以我建议提供更多关于数据库结构的信息,例如Iterations,a可以有很多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));

总体思路是扁平化子查询中的层次结构,以便可以轻松连接。

于 2012-11-01T23:13:35.163 回答