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

Ugyldig identifikator i dobbelt-indlejret forespørgsel med ORDER BY og ROWNUM

I den skalære underforespørgsel, du bruger, kan du kun referere til tabellerne fra "hoved"-forespørgslen "et indlejret niveau nede", ikke længere nede, som du har set. (Jeg tror, ​​at denne begrænsning er ophævet i version 12, så måske du bare kan opgradere din database?;-)

I den skalære underforespørgsel forsøger du at få værdien af ​​INSERTDATE-kolonnen i den første række i henhold til din bestilling. Det kan også skrives uden indlejring som følger:

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 fortæller MAX-funktionen, at den kun skal beregne MAX. af de rækker, der rangerer først i ORDER BY-klausulen. Så hvis din ORDER BY er "unik", vil MAX kun blive anvendt på én række. Hvis din ORDER BY ikke er "unik" og kan have dubletter, kan du overveje, om du vil have MAX eller MIN (eller tilføje noget til ORDER BY for at gøre den unik.)

(Hvis du havde været på Oracle version 12, ville et alternativ til KEEP (DENSE_RANK-tricket være at bruge FIRST 1 ROW ONLY-sætningen i SELECT-sætningen).




  1. Database backup SQL Query

  2. Brug af ODBC med Salesforce og Active Directory Federation Services (ADFS) Single Sign On (SSO)

  3. Zen-vogn:Jeg vil gerne forespørge fra en bestemt kategori dens produktnavn, pris, billede, beskrivelse og attributter

  4. Jeg vil tilføje 30 dage til mysql-datorækken