未测试,试一下SELECT A.CODE,B.时间 ( select (select to_char(add_months(to_date(min(开始时间),''yyyymm),d.rn-1),'yyyymm') from 表2) 时间 from (select rowun rn from dual connect by ROWNUM<=(SELECT MONTHS_BETWEEN(to_date(min(结束时间),''yyyymm),to_date(min(开始时间),''yyyymm)) FROM 表2)) D ) B,表2 A WHERE A.开始 时间<=B.时间 AND A.结束时间>=B.时间 union--union本身可以自动去重的 select code,时间 from 表1
SQL> select 500584105,201301+level-1 from dual connect by level<= (to_number(201307)-to_number(201301))+1 2 union 3 select 500584105,201301 from dual; 500584105 201301+LEVEL-1 ---------- -------------- 500584105 201301 500584105 201302 500584105 201303 500584105 201304 500584105 201305 500584105 201306 500584105 201307已选择7行。
SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret FROM (SELECT DISTINCT code FROM tab_1) t1, tab_2 t2 WHERE t1.code = t2.code CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0 --tab_1:表一 --tabl_2:表二 --t2.ed:结束时间 --t2.st:开始时间
(
select (select to_char(add_months(to_date(min(开始时间),''yyyymm),d.rn-1),'yyyymm') from 表2) 时间
from (select rowun rn from dual
connect by ROWNUM<=(SELECT MONTHS_BETWEEN(to_date(min(结束时间),''yyyymm),to_date(min(开始时间),''yyyymm))
FROM 表2)) D
) B,表2 A
WHERE A.开始 时间<=B.时间 AND A.结束时间>=B.时间
union--union本身可以自动去重的
select code,时间 from 表1
2 union
3 select 500584105,201301 from dual; 500584105 201301+LEVEL-1
---------- --------------
500584105 201301
500584105 201302
500584105 201303
500584105 201304
500584105 201305
500584105 201306
500584105 201307已选择7行。
SELECT t1.code, t2.st, t2.ed, t2.st + LEVEL - 1 ret
FROM (SELECT DISTINCT code
FROM tab_1) t1,
tab_2 t2
WHERE t1.code = t2.code
CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0
--tab_1:表一
--tabl_2:表二
--t2.ed:结束时间
--t2.st:开始时间
实验了下当TAB_2只有1条数据时可行,多条存在数据重复现象
哈哈,我再加工一下
SQL> select * from t; ID COL1 COL2
---------- -------------------- --------------------
1 500584105 201301
2 500584105 201302
3 500584105 201303
4 500584105 201304
5 500584106 201302
6 500584106 201303
7 500584106 201304
8 500584106 201305已选择8行。SQL> select * from t1; ID COL1 D1 D2
---------- -------------------- -------------------- ----------------
2 500584106 201301 201304
1 500584105 201301 201307SQL> select distinct col1, to_char(d1 + level - 1)/*, d1, d2*/
2 from t1
3 connect by level <= (to_number(d2) - to_number(d1)) + 1
4 union
5 select col1,col2 from t;COL1 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/
-------------------- ----------------------------------------
500584105 201301
500584105 201302
500584105 201303
500584105 201304
500584105 201305
500584105 201306
500584105 201307
500584106 201301
500584106 201302
500584106 201303
500584106 201304COL1 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/
-------------------- ----------------------------------------
500584106 201305已选择12行。
大神,能否解释下,这个CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0;尤其是后面 - LEVEL + 1 是怎么个用法的。没太明白,多谢。
大神,能否解释下,这个CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0;尤其是后面 - LEVEL + 1 是怎么个用法的。没太明白,多谢。
http://www.cnblogs.com/lettoo/archive/2010/08/03/1791239.html
这个介绍CONNECT BY的,里面有3个例子,你看看有介绍LEVEL,CONNECT_BY_ISLEAF等等介绍的