0

私は2つのテーブルを持っています。1 番目のテーブルには 2 番目のテーブルへの参照が含まれていますが、2 番目のテーブルは自己参照です。
以下はサンプルテーブルです

Table_P
-----------------------------
P_ID     P_TOKEN     FID
-----------------------------
1        P1          F1
2        P2          F2
3        P3          F3
4        P4          F4
-----------------------------

Table_F
----------------------------------
F_ID     F_TOKEN     PARENT_TOKEN
----------------------------------
1        F1          F2
2        F2          F3
3        F3          null
4        F4          null
----------------------------------

期待される結果

---------------------
P_TOKEN     F_TOKEN  
---------------------
F1          F3
F2          F3       
F3          F3       
F4          F4       
---------------------

クエリを選択

SELECT p.P_TOKEN,
  (select F_TOKEN from 
      (select tF.F_TOKEN, tF.PARENT_F from TABLE_F tF 
        connect by tF.F_TOKEN = prior tF.PARENT_TOKEN start with tP.FID = tF.F_ID)
    where PARENT_F is null
  ) as "F Value" FROM TABLE_P tF

しかし、そうすると例外がスローされます

ORA-00904: "tP"."FID": invalid identifier

親切に回避策を提案してください。どうもありがとう。

4

1 に答える 1

0

現在のクエリは、報告したエラー メッセージまたはテーブル スキーマと一致していないようです。データ型が一致していません。また、接続方法が必要な情報を取得していないようです。複数の行が取得される可能性があります。まず、各親行。一部のバージョンの Oracle では、複数のサブクエリでテーブル エイリアスを参照することにも問題があります。

結合する方が簡単かもしれません。TABLE_F次のような方法で階層情報を取得できます。

select tF.F_TOKEN, tF.PARENT_TOKEN, connect_by_root F_TOKEN as ROOT_F_TOKEN,
  connect_by_isleaf as ISLEAF
from TABLE_F tF 
connect by tF.F_TOKEN = prior tF.PARENT_TOKEN;

F_TOKEN PARENT_TOKEN ROOT_F_TOKEN     ISLEAF
------- ------------ ------------ ----------
F1      F2           F1                    0 
F2      F3           F1                    0 
F3                   F1                    1 
F2      F3           F2                    0 
F3                   F2                    1 
F3                   F3                    1 
F4                   F4                    1 

ROOT_F_TOKEN葉ノードのみに関心があり、それらにより、生成された を 親 と一致させることができますFID。それをインライン ビューとして使用する:

select tP.P_TOKEN, tF.F_TOKEN
from TABLE_P tP
join (
  select tF.F_TOKEN, connect_by_root F_TOKEN as ROOT_F_TOKEN,
    connect_by_isleaf as ISLEAF
  from TABLE_F tF 
  connect by tF.F_TOKEN = prior tF.PARENT_TOKEN
) tF on tF.ROOT_F_TOKEN = tP.FID
where tF.ISLEAF = 1;

P_TOKEN F_TOKEN
------- -------
P1      F3      
P2      F3      
P3      F3      
P4      F4      
于 2015-03-04T18:56:07.337 に答える