Oracle
 sql >> Base de données >  >> RDS >> Oracle

Jointure efficace avec une sous-requête corrélée

Essayez ceci :

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. Il me semble que le seul point pour conserver toutes ces Dates dans la base de données est d'obtenir un calendrier continu avec les jours fériés marqués.

Vous pouvez générer un calendrier de longueur arbitraire dans Oracle en utilisant la construction suivante :

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

et ne garder que les jours fériés dans Dates . Une simple jointure vous montrera quelles Dates sont des jours fériés et qui ne le sont pas.