我有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
?
谢谢!
我不确定您的数据库结构是否正确,但我希望我的想法在任何情况下都能对您有所帮助。所以我建议提供有关数据库结构的更多信息,例如一个
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));
总体思路是扁平化子查询中的层次结构,以便可以轻松连接。