Oracle通过嵌套子查询连接

时间:2015-03-04 17:38:51

标签: sql oracle select connect-by

我有2张桌子。 1st包含对第二个表的引用,而第二个表是自引用 以下是样本表

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

请建议解决问题。非常感谢。

1 个答案:

答案 0 :(得分: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