使用しているスカラーサブクエリでは、「メイン」クエリの「1つ下のネストされたレベル」のテーブルのみを参照でき、これまで見てきたように、それ以上下のテーブルは参照できません。 (この制限はバージョン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をのみ計算するように指示します。 最初にランク付けされた行の ORDERBY句内。したがって、ORDER BYが「一意」の場合、MAXは1つにのみ適用されます。 行。 ORDER BYが「一意」ではなく、重複する可能性がある場合は、MAXまたはMINのどちらが必要かを検討する(またはORDER BYに何かを追加して一意にする)ことを検討してください。
(Oracleバージョン12を使用していた場合は、KEEPの代わりになります(DENSE_RANKのトリックは、SELECTステートメントのFIRST 1 ROW ONLY句を使用することです。)