解决方案 »

  1.   

    未测试,试一下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
      

  2.   

    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行。
      

  3.   


    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:开始时间
      

  4.   


    实验了下当TAB_2只有1条数据时可行,多条存在数据重复现象
      

  5.   

    B表应该不只是这一行吧,是不是想得太简单了,呵呵
    哈哈,我再加工一下
    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行。
      

  6.   


    大神,能否解释下,这个CONNECT BY t2.ed - t2.st - LEVEL + 1 >= 0;尤其是后面 - LEVEL + 1 是怎么个用法的。没太明白,多谢。
      

  7.   


    大神,能否解释下,这个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等等介绍的