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

相関サブクエリによる効率的な結合

    これを試してください:

    SELECT  rt.rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty
    FROM    (
        SELECT  *
        FROM    (
            SELECT  r.*, t.*, SUM(doUse) OVER (PARTITION BY rangeId ORDER BY aDate) AS span
            FROM    (
                SELECT  r.rangeId, startDate, MAX(day) AS dm
                FROM    Range r, Days d
                WHERE   d.rangeid = r.rangeid
                GROUP BY
                    r.rangeId, startDate
                ) r, Dates t
            WHERE   t.adate >= startDate
            ORDER BY
                rangeId, t.adate
            )
        WHERE
            span <= dm
        ) rt, Days d
    WHERE   d.rangeId = rt.rangeID
        AND d.day = GREATEST(rt.span, 1)
    

    P.S.これらすべてのDatesを保持する唯一のポイントは私には思えます データベースには、休日がマークされた継続的なカレンダーを取得することがあります。

    次の構成を使用して、Oracleで任意の長さのカレンダーを生成できます。

    SELECT :startDate + ROWNUM
    FROM   dual
    CONNECT BY
           1 = 1
    WHERE  rownum < :length
    

    Datesでは休日のみを保持します 。単純な結合により、どのDatesが表示されます 休日であり、そうではありません。



    1. PostgreSQLデータベースのすべてのインデックス名、列名、およびそのテーブル名を一覧表示します

    2. OCI_CONNECTにより、ORA-01438:この列で許可されている指定された精度よりも大きい値が発生する可能性がありますか?

    3. MySQLに平日のリストを保存する方法は?

    4. プログラムの一部でMySQLクエリキャッシュを明示的に無効にする