2015-03-04 2 views
0

У меня есть 2 таблицы. Первая содержит ссылку на вторую таблицу, тогда как вторая таблица - это саморефлексия.
Ниже таблица выборкиOracle подключается с вложенными подзапросами

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 

Но делать это бросает exceptio n

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

Просьба предлагать работу вокруг. Большое спасибо.

+4

Вы видите "tP". "FID" в вашем запросе? Я не. – kevinsky

+0

Ну, в запросе есть «tP.FID» (строка 4, столбец 66), но не цитируется как «tP» '; но если вы запустите это, он жалуется на «P». «P_TOKEN» «сначала так или иначе, поскольку у вас нет ни одного псевдонима как' p'. Каков ваш полный фактический запрос и соответствующая ошибка ?. –

+1

Глядя на данные, столбец FID в таблице_P не может быть присоединен к F_ID из Table_F в любом случае (если вы намерены присоединиться к двум таблицам, которые вы не делаете), так как один из них является числом, а другой - VARCHAR2. В результате почему столбец P_Token имеет такие значения, как F1, F2, ... вместо P1, P2, ... Было бы хорошо, если бы вы могли объяснить объяснение логики результата, потому что на данный момент кажется, вы просто находите конечного родителя F_Token, идущего к корню и возвращающего тот же самый элемент, если он равен нулю. Это можно сделать только из таблицы Table_F. – ruudvan

ответ

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  
Смежные вопросы