在Oracle中,我有一个包含5个字段的表:
ID
PublishDate
开始日期
结束日期
值
这里的想法是,我希望“生成”StartDate和EndDate之间的记录,其值与ID,PublishDate和&这些记录的价值。
即这个
10, 11/20/2014, 1/1/2016, 3/1/2016, 10
变成
10, 11/20/2014, 1/1/2016, 10
10, 11/20/2014, 2/1/2016, 10
10, 11/20/2014, 3/1/2016, 10
所以我在一个proc中完成了这个,我循环遍历每条记录并生成记录,但我想知道是否有SQL方法可以做这样的事情?
答案 0 :(得分:1)
您可以使用CONNECT BY子句进行分层查询:
select * from (select 10 id, '11/20/2014' PublishDate, '1/1/2016' StartDate, '3/1/2016' EndDate, 10 value
from dual connect by level <= 10);
CONNECT BY level <= N
将为表格的每一行生成N份副本
对于你的情况:
SELECT ID, PublishDate, StartDate + lvl, VALUE
FROM your_tab
JOIN (SELECT LEVEL - 1 lvl FROM dual
CONNECT BY LEVEL <= (SELECT round(MAX(trunc(EndDate) - trunc(StartDate))) FROM your_tab)
)
ON trunc(EndDate) - trunc(StartDate) >= lvl