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

问题描述 投票:0回答:1

我有3张桌子。 桌子

Test
Folder
Iteration

每个

test
都与
Folder
链接。 与
Folder
链接的
test
是许多其他
folders
的子级。

从这些

folders
层次结构顶部的那个与表
Iteration
链接。

现在我想更新Test表中的

Iteration_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 =  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

谢谢!

sql oracle join tree connect-by
1个回答
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));

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

© www.soinside.com 2019 - 2024. All rights reserved.