我有3张桌子。
表Test
,Folder
和Iteration
。
每个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
获取根文件夹?
谢谢!
答案 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));
一般的想法是在子查询中展平层次结构,以便它可以很容易地加入。