我有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
请建议解决问题。非常感谢。
答案 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