Oracle
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва да изрежете празно пространство в Oracle

  2. SQL - липсваща дясна скоба

  3. ORA-00900:невалиден SQL израз - когато стартирате процедура в oracle 10g

  4. Как да създадете PL/SQL съхранени процедури без параметри в базата данни на Oracle

  5. Как да импортирате данни от Excel в таблица Toad 9.5