sql >> Databasteknik >  >> RDS >> Oracle

Ogiltig identifierare i dubbelkapslad fråga med ORDER BY och ROWNUM

I den skalära underfrågan du använder kan du bara referera till tabellerna från "huvudfrågan" "en kapslad nivå ner", inte längre ner, som du har sett. (Jag tror att denna begränsning är upphävd i version 12, så du kanske bara kan uppgradera din databas?;-)

I den skalära underfrågan försöker du få värdet på INSERTDATE-kolumnen i den första raden enligt din beställning. Det kan också skrivas utan kapsling enligt följande:

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 talar om för MAX-funktionen att den ska beräkna MAX endast av de rader som rankas först i ORDER BY-klausulen. Så om din ORDER BY är "unik" kommer MAX endast att tillämpas på en rad. Om din ORDER BY inte är "unik" och kan ha dubbletter, kanske du funderar på om du vill ha MAX eller MIN (eller lägga till något i ORDER BY för att göra den unik.)

(Om du hade varit på Oracle version 12, skulle ett alternativ till KEEP (DENSE_RANK-tricket vara att använda FIRST 1 ROW ONLY-satsen i SELECT-satsen.)




  1. Handledning för Microsoft Access 2010, 2013, 2016 och 2019

  2. Tidsbaserad prioritet i Active Record Query

  3. HighCharts-problem i dubbla axlar, linje- och kolumndiagram

  4. Kan du använda flera kolumner för en inte i fråga?