Sql 具有按内部连接和更新连接的树结构

Sql 具有按内部连接和更新连接的树结构,sql,oracle,join,tree,connect,Sql,Oracle,Join,Tree,Connect,我有三张桌子。 表测试,文件夹和迭代 每个测试都与文件夹链接。 链接到测试的文件夹是许多其他文件夹的子文件夹 从这些文件夹中层次结构顶部的文件夹与表迭代链接 现在我想更新测试表中的迭代ID。所以我在测试和迭代之间有一个“快速”的连接。 这是我的尝试: update Test a set a.Iteration_ID = (nvl(( --The Select Part select b.ID from Iteration b inner join Folder c on b.Folde

我有三张桌子。 表
测试
文件夹
迭代

每个
测试
都与
文件夹
链接。 链接到
测试的
文件夹
是许多其他
文件夹
的子文件夹

从这些
文件夹中
层次结构顶部的文件夹与表
迭代链接

现在我想更新
测试表中的迭代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。我想在那里设置文件夹ID :

问题是Oracle不知道a.folder\u id

ORA-00904: "A"."FOLDER_ID": ungültiger Bezeichner
00904. 00000 -  "%s: invalid identifier"
有人知道解决问题或改进查询的更好方法吗

例如,使用
选择*from和rownum=1来获取根文件夹


谢谢

我不确定您的DB结构是否正确,但我希望我的想法在这两种情况下都能对您有所帮助。因此,我建议提供更多关于数据库结构的信息,例如,对于
测试
,是否会有许多
迭代

因此,我的建议如下:

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

总体思路是将子查询中的层次结构展平,以便可以轻松联接。

我不确定您的数据库结构是否正确,但我希望我的想法在这两种情况下都能对您有所帮助。因此,我建议提供更多关于数据库结构的信息,例如,对于
测试
,是否会有许多
迭代

因此,我的建议如下:

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));
总体思路是将子查询中的层次结构展平,以便可以轻松地连接