结构及数据:
SQL> DESC TESTA
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------
 F1                                                 NUMBER(1)
 F2                                                 NUMBER(2)
 F3                                                 DATESQL> DESC TESTB
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------
 F1                                                 NUMBER(1)
 F2                                                 CHAR(6)
 F3                                                 CHAR(5)
 F4                                                 CHAR(5)SQL> SELECT F1,F2,TO_CHAR(F3,'YYYYMMDDHH24MISS') F3 FROM TESTA;
        F1         F2 F3
---------- ---------- --------------
         1         10 20050502070000
         2         20 20050502090000
         3         30 20050502070000
         4         40 20050502070000
         5         50 20050502070000SQL> SELECT * FROM TESTB;
        F1 F2     F3    F4
---------- ------ ----- -----
         1 200502 08:00 20:00
         2 200502 08:00 20:00
         3        08:00 20:00
         4 200503 08:00 20:00
         5 200501 08:00 20:00需求描述:  指定年月A=200502  如果TESTB.F2>A,取F3 
  如果TESTB.F2<A, 取F4         
  如果TESTB.F2=NULL,取F4        将A的上月月末日和取到的时间(F3或F4) 拼接起来(设为C)
  将A的当月月末日和取到的时间(F3或F4) 拼接起来(设为D)  求纪录的个数(COUNT(*));
  关联条件:
  TESTA.F1=TESTB.F1 AND
  TESTA.F3>C AND
  TESTA.F3<D
  
高手请不吝赐教,最好考虑性能(数据量:TESTA表 10万;TESTB 1万)

解决方案 »

  1.   

    用decode或是自己写一个function,存储过程会写吧,就和其他的程序语言差不多
      

  2.   

    建立一个表 包含 月份   上月月末日       当月月末日
    create table monthtable(mon char(6),bd char(8),ed char(8));
    insert into monthtable values('200502','20050131','20050228');下面的语句没有仔细看过,你瞧瞧
    select count(*) as num
    from testa a,
    (select f1,( m.bd || case when f2>'200502' then f3 else f4 end ) as c,
    ( m.ed || case when f2>'200502' then f3 else f4 end ) as d
      from testb,monthtable m
    where testb.f1 = m.mon ) cd
    where a.f1 = cd.f1 and a.f3>c and a.f3<d;10万是小表,可以建index加快查询速度。