Oracle
 sql >> база данни >  >> RDS >> Oracle

Невалиден идентификатор в двойно вложена заявка с ORDER BY и ROWNUM

В скаларната подзаявка, която използвате, можете да препращате само към таблиците от „главната“ заявка „едно вложено ниво надолу“, а не по-надолу, както видяхте. (Вярвам, че това ограничение е премахнато във версия 12, така че може би можете просто да надстроите вашата база данни?;-)

В скаларната подзаявка се опитвате да получите стойността на колоната INSERTDATE на първия ред според вашата поръчка. Това също може да бъде написано без влагане, както следва:

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 казва на функцията MAX, че трябва да изчисли MAX само от онези редове, които се класират на първо място в клаузата ORDER BY. Така че, ако вашият ORDER BY е „уникален“, MAX ще се приложи само към един ред. Ако вашият ORDER BY не е „уникален“ и може да има дубликати, можете да помислите дали искате MAX или MIN (или да добавите нещо към ORDER BY, за да го направите уникален.)

(Ако сте били на Oracle версия 12, алтернатива на KEEP (трика DENSE_RANK би била да използвате клаузата FIRST 1 ROW ONLY на израза SELECT.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генериране на отделни редове за всеки месец в период от време

  2. Актуализиране на заявката if за Oracle

  3. верни ли са твърденията, че Oracle е труден за администриране при прости задачи? няма ли качествени админ приложения за него?

  4. Потребителско дефинирана рутина с DBMS_STATS, част II

  5. Oracle - Проблем при създаването на тригер, който актуализира друга таблица