0

我有 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的与 parent匹配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 回答