如何在Oracle中从单行插入多行

Arm*_*aee 1 oracle

我在Oracle数据库中有下表

src_tbl
id     from_date      thru_date
------------------------------
1      01-JAN-2015    31-oct-2016
2      01-APR-2016    31-DEC-2015
3      01-JUL-2014    31-DEC-2016
Run Code Online (Sandbox Code Playgroud)

我想将src_tbl中的行插入到目标表中,并在from_date和thru_date之间为每个月创建一行,如下所示:

tgt_tbl
--------------------------
id           month
1            JAN-2015
1            FEB-2015
1            MAR-2015
...
...
2            APR-2016
2            MAY-2016
2            JUN-2016            
...
...
3            JUL-2014
3            AUG-2014
3            SEP-2014
3            OCT-2014
...
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激.

mat*_*guy 5

select     id, to_char( add_months(from_date, level - 1), 'MON-yyyy' ) as mth
from       src_tbl
connect by level <= months_between(thru_date + 1, from_date)
       and prior id = id
       and prior sys_guid() is not null
;
Run Code Online (Sandbox Code Playgroud)

注意:正如评论中所讨论的,我假设"环境"保证thru_date永远不会比from_date任何更早id.如果是,则此查询将生成一行(对于from_date月份),或许它应该不生成.理想情况下,逻辑条件由基表上的检查约束强制执行.