Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wydajne sprzężenie ze skorelowanym podzapytaniem

Spróbuj tego:

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. Wydaje mi się, że jedynym punktem, aby zachować wszystkie te Dates w bazie danych jest uzyskanie ciągłego kalendarza z zaznaczonymi świętami.

Możesz wygenerować kalendarz o dowolnej długości w Oracle, używając następującej konstrukcji:

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

i zachowuj tylko święta w Dates . Proste dołączenie pokaże Ci, które Dates są świętami, a które nie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wygenerować ślad FRD w Oracle Apps 11i/R12?

  2. Kodowanie zestawu znaków i współczynniki rozmiaru pamięci

  3. Funkcja daty Oracle dla poprzedniego miesiąca

  4. Połączenie z Oracle działa za pośrednictwem aplikacji konsolowej i nie działa za pośrednictwem usługi sieciowej

  5. Karta sieciowa nie mogła nawiązać połączenia — Oracle 11g