sql >> Database teknologi >  >> RDS >> Oracle

Effektiv joinforbindelse med en korreleret underforespørgsel

Prøv dette:

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. Det forekommer mig, at det eneste punkt at beholde alle disse Dates i databasen er at få en løbende kalender med helligdage markeret.

Du kan generere en kalender af vilkårlig længde i Oracle ved at bruge følgende konstruktion:

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

og hold kun helligdage i Dates . En simpel join vil vise dig hvilke Dates er helligdage, og hvilke der ikke er.



  1. Hvordan konfigureres phpmyadmin og SQL til meddelelser via REST-api?

  2. OPDATERING med SUM() i MySQL

  3. Fejl 1038 Uden for sorteringshukommelse, overvej at øge sorteringsbufferens størrelse

  4. Vil et SQL Server-job springe en planlagt kørsel over, hvis det allerede kører?