sql >> Database >  >> RDS >> Oracle

Efficiënt samenvoegen met een gecorreleerde subquery

Probeer dit:

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. Het lijkt mij dat het enige punt om al deze Dates te bewaren in de database is om een ​​doorlopende kalender te krijgen met gemarkeerde feestdagen.

U kunt in Oracle een kalender van willekeurige lengte genereren met de volgende constructie:

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

en bewaar alleen feestdagen in Dates . Een simpele join laat je zien welke Dates feestdagen zijn en welke niet.



  1. Rapport van Double Entry Accounting

  2. Items uitsluiten volgens een record

  3. MySql Spaanse karaktergegevens

  4. Toon volledige SQL-query in Show Processlist van MySQL