Oracle
 sql >> Database >  >> RDS >> Oracle

Identificatore non valido nella query a doppia nidificazione con ORDER BY e ROWNUM

Nella sottoquery scalare che stai utilizzando, puoi solo fare riferimento alle tabelle dalla query "principale" "un livello nidificato in basso", non più in basso, come hai visto. (Credo che questa restrizione sia stata eliminata nella versione 12, quindi forse puoi semplicemente aggiornare il tuo database?;-)

Nella sottoquery scalare stai cercando di ottenere il valore della colonna INSERTDATE della prima riga in base al tuo ordinamento. Questo può anche essere scritto senza annidamento come segue:

SELECT
O.INSERTDATE OrderCreateDate,

-- Determine delivery date
(SELECT MAX(DD.INSERTDATE) KEEP (
          DENSE_RANK FIRST ORDER BY
          DD.CLOSED ASC, ABS(TRUNC(CURRENT_DATE-TO_DATE(TO_CHAR(DD.INSERTDATE, 'DDMMYYYY'), 'DDMMYYYY'))) ASC
        )
   FROM MY_DELIVERYDATE_TABLE DD
   JOIN MY_ORDERPOS_TABLE OP2 ON DD.FK_ORDERPOS=OP2.ID
   LEFT OUTER JOIN MY_ORDER_TABLE O2 ON OP2.FK_ORDER=O2.ID
   WHERE OP2.FK_ORDER=O.ID AND -- This will no longer give "Invalid identifier O.ID"
         DD.DELFLAG IS NULL AND OP2.DELFLAG IS NULL
) DeliveryDate

FROM MY_ORDER_TABLE O
WHERE O.ID = 620; -- ID goes here!

KEEP (DENSE_RANK FIRST dice alla funzione MAX che dovrebbe calcolare il MAX solo di quelle righe che si classificano prima nella clausola ORDER BY. Quindi se il tuo ORDER BY è "unico", MAX verrà applicato solo a uno riga. Se il tuo ORDER BY non è "unico" e può avere duplicati, potresti pensare se vuoi il MAX o il MIN (o aggiungere qualcosa all'ORDER BY per renderlo unico.)

(Se fossi stato su Oracle versione 12, un'alternativa al KEEP (il trucco DENSE_RANK sarebbe usare la clausola FIRST 1 ROW ONLY dell'istruzione SELECT.)