Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Nieprawidłowy identyfikator w podwójnie zagnieżdżonym zapytaniu z ORDER BY i ROWNUM

W podzapytaniu skalarnym, którego używasz, możesz odwoływać się tylko do tabel z zapytania „głównego” „jeden poziom zagnieżdżony niżej”, a nie dalej, jak widziałeś. (Uważam, że to ograniczenie zostało zniesione w wersji 12, więc może możesz po prostu zaktualizować swoją bazę danych?;-)

W podzapytaniu skalarnym próbujesz uzyskać wartość kolumny INSERTDATE pierwszego wiersza zgodnie z Twoją kolejnością. Można to również napisać bez zagnieżdżania w następujący sposób:

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 mówi funkcji MAX, że powinna obliczyć MAX tylko z tych wierszy, które zajmują pierwsze w klauzuli ORDER BY. Jeśli więc Twoje ORDER BY jest „unikalne”, MAX zostanie zastosowany tylko do jednego wiersz. Jeśli Twoje ORDER BY nie jest „unikalne” i może mieć duplikaty, możesz zastanowić się, czy chcesz mieć MAX lub MIN (lub dodać coś do ORDER BY, aby było wyjątkowe).

(Jeśli korzystałeś z Oracle w wersji 12, alternatywą dla KEEP (sztuczka DENSE_RANK polegałaby na użyciu klauzuli FIRST 1 ROW ONLY w instrukcji 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. Tworzenie wyzwalacza, który będzie uruchamiany tylko wtedy, gdy tworzona jest nowa tabela

  2. Oracle — podziel pojedynczy wiersz na wiele wierszy

  3. Zmień hasło użytkownika przez jdbc. Problemy z przepustkami zawierającymi znaki zapytania

  4. Jak mogę utworzyć formularz wstawiania/aktualizacji dla wielu tabel w Oracle Apex 5.1.4?

  5. Nie widać dostawcy danych Oracle dla platformy .NET w programie Visual Studio 2012 RC