sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:Omskriv rekursiv CTE for at erstatte muligheden maxrecursion i en visning

Du kunne bruge en optælling:det er en sæt-baseret løsning, der yder bedre end rekursion, når antallet af iterationer stiger - og den understøttes i visninger.

Her er en tilgang:

select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
    select row_number() over (order by (select null)) - 1
    from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
    on dateadd(day, x.n, t.begindate) <= case 
        when enddate <= convert(date, getdate()) then enddate
        else convert(date, getdate())
    end

Optællingen genererer alle tal mellem 0 og 999 (du kan nemt udvide den ved at tilføje cross join s). Vi bruger den til at "multiplicere" rækkerne i den oprindelige tabel og generere datointervallet.

Jeg forsøgte at omskrive den del, der håndterer slutdatoen. Jeg forstår, at du ikke ønsker fremtidige datoer, så det er, hvad betingelsen i on klausul gør.

For disse eksempeldata:

ObjectId | Amount | beginDate  | endDate   
-------: | -----: | :--------- | :---------
       1 |    500 | 2020-12-28 | null      
       2 |     35 | 2019-09-26 | 2019-10-01
       3 |    200 | 2020-05-28 | 2020-06-02

Forespørgslen returnerer:

objectid | amount | dt        
-------: | -----: | :---------
       1 |    500 | 2020-12-28
       1 |    500 | 2020-12-29
       1 |    500 | 2020-12-30
       1 |    500 | 2020-12-31
       2 |     35 | 2019-09-26
       2 |     35 | 2019-09-27
       2 |     35 | 2019-09-28
       2 |     35 | 2019-09-29
       2 |     35 | 2019-09-30
       2 |     35 | 2019-10-01
       3 |    200 | 2020-05-28
       3 |    200 | 2020-05-29
       3 |    200 | 2020-05-30
       3 |    200 | 2020-05-31
       3 |    200 | 2020-06-01
       3 |    200 | 2020-06-02

Demo på DB Fiddle



  1. Mysql vælg ordinal

  2. Introduktion til PL/SQL-undtagelseshåndtering i Oracle-database

  3. Indstil kun variabel i psql-script, hvis den ikke er angivet på kommandolinjen

  4. SQL-syntaksfejl 1064