当前位置: 代码迷 >> Oracle开发 >> sql 时间重复解决方案
  详细解决方案

sql 时间重复解决方案

热度:13   发布时间:2016-04-24 06:35:12.0
sql 时间重复
如何将两张表中的时间段一条条的显示,并且要去掉重复的时间。
表1 : 主键id        code                             时间   
              1              500584105                 201301
              2              500584105                 201302
              3              500584105                 201303
              4              500584105                 201304

表2 : 主键id        code                            开始 时间          结束时间  
              1              500584105                 201301              201307
           
查询的结果是:
                            500584105              201301
                            500584105              201302
                            500584105              201303
                            500584105              201304
                            500584105              201305
                            500584105              201306
                            500584105              201307
ps:这两张表要通过code关联。如果表2中的时间段包含表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

------解决思路----------------------

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

------解决思路----------------------
引用:
Quote: 引用:

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

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               201307

SQL>   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            201304

COL1                 TO_CHAR(D1+LEVEL-1)/*,D1,D2*/
-------------------- ----------------------------------------
500584106            201305

已选择12行。

------解决思路----------------------
引用:
Quote: 引用:


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


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