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).