2016-08-09 1 views
-1

Почему внешние поля не могут использоваться в этом подзапросе?используя ROWNUM TOP-N

SELECT d1_cod, 
     D1_VUNIT, 
    (
    SELECT sd2.d1_vunit from (select d1_filial,d1_vunit,d1_emissao,d1_cod,d1_doc) 
     FROM sd1160 sd12 
    WHERE sd12.D1_EMISSAO < **x.d1_emissao** 
     And sd12.D1_FILIAL = **x.d1_filial** 
     And sd12.D1_COD = **x.d1_cod** 
     And sd12.D_E_L_E_T_ = ' ' 
    ORDER BY sd12.d1_emissao DESC) 
    Where ROWNUM < 2) 
     FROM sd1160 x 
    WHERE x.D_E_L_E_T_ = ' ' 
     AND x.d1_emissao = '20160808' 
    ORDER BY x.d1_emissao DESC 
) 

Благодаря

+0

Вы действительно повезло, что некоторые пользователи SO ума читатели, потому что ваш вопрос очень, очень неясно. Что вы подразумеваете под * внешними полями *? Кто они? Что происходит с вашим текущим запросом? Вы получаете сообщение об ошибке? Это все очень важные детали, которые вы всегда должны включать в свой вопрос. Кроме того, ваш заголовок вводит в заблуждение, поскольку он не имеет ничего общего с вашей проблемой. – sstan

+0

Извините. В следующем будет яснее! –

ответ

0

Oracle распознает только коррелированные вспоминай уровня глубоко. Один из способов обойти это использовать keep синтаксис:

SELECT d1_cod, 
     D1_VUNIT, 
     (SELECT MAX(st12.d1_vunit) KEEP (DENSE_RANK FIRST ORDER BY sd12.d1_emissao DESC) 
     FROM sd1160 sd12 
     WHERE sd12.D1_EMISSAO < **x.d1_emissao** AND 
       sd12.D1_FILIAL = **x.d1_filial** AND 
       sd12.D1_COD = **x.d1_cod** AND 
       sd12.D_E_L_E_T_ = ' ' 
     ) 
FROM sd1160 x 
WHERE x.D_E_L_E_T_ = ' ' AND x.d1_emissao = '20160808' 
ORDER BY x.d1_emissao DESC;