Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Gabung yang efisien dengan subquery yang berkorelasi

Coba ini:

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. Tampaknya bagi saya bahwa satu-satunya poin untuk menyimpan semua Dates ini dalam database adalah untuk mendapatkan kalender berkelanjutan dengan hari libur yang ditandai.

Anda dapat membuat kalender dengan panjang sewenang-wenang di Oracle menggunakan konstruksi berikut:

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

dan simpan hanya hari libur di Dates . Gabung sederhana akan menunjukkan kepada Anda Dates . yang mana adalah hari libur dan mana yang bukan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah Kinerja Besar Dengan Oracle DataReader di .Net

  2. Alat yang Tepat Membuat Tuning Bekerja Cepat

  3. Menggunakan fungsi di mana klausa dengan parameter clob

  4. Menemukan 'lari' baris dari kumpulan hasil yang dipesan

  5. Evaluasi hubungan pendek CASE dan COALESCE bekerja dengan urutan dalam PL/SQL tetapi tidak dalam SQL