आप जिस स्केलर सबक्वेरी का उपयोग कर रहे हैं, उसमें आप केवल "मुख्य" क्वेरी "एक नेस्टेड स्तर नीचे" से तालिकाओं का संदर्भ दे सकते हैं, और नीचे नहीं, जैसा कि आपने देखा है। (मेरा मानना है कि यह प्रतिबंध संस्करण 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 केवल की गणना करनी चाहिए उन पंक्तियों में से जो प्रथम rank को रैंक करती हैं ORDER BY क्लॉज में। इसलिए यदि आपका ORDER BY "अद्वितीय" है, तो MAX केवल एक . पर लागू होगा पंक्ति। यदि आपका ORDER BY "अद्वितीय" नहीं है और इसमें डुप्लीकेट हो सकते हैं, तो आप सोच सकते हैं कि क्या आप MAX या MIN चाहते हैं (या इसे विशिष्ट बनाने के लिए ORDER BY में कुछ जोड़ें।)
(यदि आप Oracle संस्करण 12 पर थे, तो KEEP का एक विकल्प (DENSE_RANK ट्रिक यह होगा कि आप SELECT स्टेटमेंट के पहले 1 ROW ONLY क्लॉज का उपयोग करें।)