2

私は3つのテーブルを持っています。テーブルTestFolderおよびIteration.

すべてtestが でリンクされていFolderます。にFolderリンクされているtestは、他の多くの子ですfolders

これらfoldersのうち、階層の最上位のものはテーブルにリンクされていますIteration

ここで、テーブルのIteration_IDを更新したいと思います。テストと反復の間に「高速」接続を確立するためです。これは私の試みです:Test

    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

DB 構造が正しいかどうかはわかりませんが、どちらの場合でも私のアイデアが役立つことを願っています。したがって、DB 構造に関する詳細情報を提供することを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));

一般的な考え方は、サブクエリの階層構造をフラット化して、簡単に結合できるようにすることです。

于 2012-11-01T23:13:35.163 に答える