2016-07-19 3 views
2

У меня есть подзапрос, который должен использовать значение из внешнего запроса. Он терпит неудачу из-за пресловутого «подзапроса в Oracle не может получить доступ к значению из родительского запроса более чем на два уровня».ORA-00904: недопустимый идентификатор в подзапросе (в предложении select)

Однако я не могу понять, как его переписать. Большинство примеров в Интернете - это когда подзапрос находится в предложении WHERE; my находится в предложении SELECT.

Помогите кому-нибудь?

select agre.*, agre.orga_ky, 
     orga.NAME_LA_LB as orga_name, 
     pers.LAST_NAME_LA_LB as SIGNATORY_ORGA__LASTNAME, pers.FIRST_NAME_LA_LB as SIGNATORY_ORGA_FIRSTNAME, 
     upper(pers.LAST_NAME_LA_LB) || ' ' || pers.FIRST_NAME_LA_LB as SIGNATORY_ORGA_FULLNAME, 
     -- Get the most current agreement for this orga and compare it with this row to find out if this row is current or expired 
     CASE WHEN (
      SELECT AGRE_KY 
      FROM (
       SELECT a.AGRE_KY 
       FROM T_AGREEMENT a 
       WHERE a.ORGA_KY = agre.orga_ky -- fail!!! ORA-00904: invalid identifier 
       ORDER BY a.REC_CREATION_DT DESC 
      ) 
      WHERE ROWNUM = 1 
     ) = agre.agre_ky THEN 'Current' ELSE 'Expired' END as agreement_status 
from T_AGREEMENT agre 
left outer join T_ORGANIZATION orga on agre.orga_ky = orga.orga_ky 
left outer join T_PERSON pers on agre.SIGNATORY_ORGA_PERS_KY = pers.pers_ky 
; 
+0

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production – Junglefish

ответ

2

Вы можете попробовать использовать функцию row_number окна без подзапроса и проверить, если он возвращает ожидаемый результат.

select agre.*, agre.orga_ky, 
orga.NAME_LA_LB as orga_name, 
pers.LAST_NAME_LA_LB as SIGNATORY_ORGA__LASTNAME, pers.FIRST_NAME_LA_LB as SIGNATORY_ORGA_FIRSTNAME, 
upper(pers.LAST_NAME_LA_LB) || ' ' || pers.FIRST_NAME_LA_LB as SIGNATORY_ORGA_FULLNAME, 
-- Get the most current agreement for this orga and compare it with this row to find out if this row is current or expired 
CASE WHEN row_number() over(partition by agre.orga_ky order by agre.REC_CREATION_DT desc) 
         ----------------^^^^^^^^^^^^ change the partitioning column per your requirement 
= 1 THEN 'CURRENT' 
ELSE 'EXPIRED' END as agreement_status 
from T_AGREEMENT agre 
left outer join T_ORGANIZATION orga on agre.orga_ky = orga.orga_ky 
left outer join T_PERSON pers on agre.SIGNATORY_ORGA_PERS_KY = pers.pers_ky 
+0

Это замечательно! Огромное спасибо! – Junglefish

Смежные вопросы