结构及数据:
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万)
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万)
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加快查询速度。