sql >> データベース >  >> RDS >> Oracle

ORDERBYとROWNUMを使用した二重ネストクエリの識別子が無効です

    使用しているスカラーサブクエリでは、「メイン」クエリの「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句を使用することです。)




    1. OracleプロシージャのPostgreSQLへの移植

    2. Oracle11gR2のWM_CONCAT関数のセパレータを変更します

    3. mysqlの結合を使用してパフォーマンスによって順序を改善する方法

    4. 全体的なスコアを計算するためのピボットを使用したSUM