Dalam subkueri skalar yang Anda gunakan, Anda hanya dapat mereferensikan tabel dari kueri "utama" "satu tingkat bersarang ke bawah", tidak lebih jauh ke bawah, seperti yang telah Anda lihat. (Saya yakin pembatasan ini dicabut di versi 12, jadi mungkin Anda bisa mengupgrade database Anda?;-)
Di subquery skalar Anda mencoba mendapatkan nilai kolom INSERTDATE dari baris pertama sesuai dengan pemesanan Anda. Itu juga dapat ditulis tanpa bersarang sebagai berikut:
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 memberi tahu fungsi MAX, bahwa ia harus menghitung MAX hanya dari baris-baris yang menempati peringkat pertama dalam klausa ORDER BY. Jadi jika ORDER BY Anda "unik", MAX hanya akan diterapkan ke satu baris. Jika ORDER BY Anda tidak "unik" dan dapat memiliki duplikat, Anda dapat memikirkan apakah Anda menginginkan MAX atau MIN (atau menambahkan sesuatu ke ORDER BY untuk membuatnya unik.)
(Jika Anda menggunakan Oracle versi 12, alternatif KEEP (trik DENSE_RANK adalah menggunakan klausa HANYA 1 ROW PERTAMA dari pernyataan SELECT.)