Иерархический запрос, который вы пытались выполнить, должен включать id = prior id
в предложении connect-by, но поскольку это вызывает циклы с несколькими строками источника, вам также необходимо включить вызов недетерминированной функции, такой как dbms_random.value
* * 1003
select id, start_date + level - 1 as day
from blah
connect by level <= end_date - start_date + 1
and prior id = id
and prior dbms_random.value is not null
С вашими примерами данных в CTE это возвращает 63 строки назад:
with blah (ID, START_DATE, END_DATE) as (
select 1, date '2018-01-01', date '2018-01-20' from dual
union all select 2, date '2018-02-13', date '2018-03-20' from dual
union all select 3, date '2018-03-01', date '2018-03-07' from dual
)
select id, start_date + level - 1 as day
from blah
connect by level <= end_date - start_date + 1
and prior id = id
and prior dbms_random.value is not null;
ID DAY
---------- ----------
1 2018-01-01
1 2018-01-02
1 2018-01-03
...
1 2018-01-19
1 2018-01-20
2 2018-02-13
2 2018-02-14
...
3 2018-03-05
3 2018-03-06
3 2018-03-07
Вам не нужно trunc()
даты, если они не относятся к полуночному времени, что кажется маловероятным в этом случае, и даже тогда это может не потребоваться, если только у даты окончания есть более позднее время (например, 23 : 59: 59) * * +1010.
Рекурсивный CTE во многих отношениях более интуитивен, по крайней мере, когда вы поймете их основную идею; так что я бы, наверное, тоже использовал подход Гордона Могут быть различия в производительности и в том, работают ли они вообще для больших объемов данных (или сгенерированных строк), но для большого количества данных в любом случае стоит сравнить разные подходы, чтобы найти наиболее подходящий / производительный.