有两表:
表A:(日志)
no zy jh bh chr2 money num1 rq ye
999998 B null null 01010104 1000 0.25 2009-6-24 12:12:00 1045.26
201 J 1001 20062271 null 500 100 2008-8-20 11:09:46 300
表B:(明细表) no jh bh gz money num1 rq
999998 1001 20062271 01070201 2.8 0 2008-8-20 11:09:46
999998 1001 20062272 01070201 2.8 0 2008-8-20 11:11:52所有明细表B的都往日志表A中插入一条记录,且表A的ZY字段为“J”我要想的数据是表A的所有字段内容,
要求:如果表A里的CHR2字段为null时,则取表B的GZ字段内容。
表A:(日志)
no zy jh bh chr2 money num1 rq ye
999998 B null null 01010104 1000 0.25 2009-6-24 12:12:00 1045.26
201 J 1001 20062271 null 500 100 2008-8-20 11:09:46 300
表B:(明细表) no jh bh gz money num1 rq
999998 1001 20062271 01070201 2.8 0 2008-8-20 11:09:46
999998 1001 20062272 01070201 2.8 0 2008-8-20 11:11:52所有明细表B的都往日志表A中插入一条记录,且表A的ZY字段为“J”我要想的数据是表A的所有字段内容,
要求:如果表A里的CHR2字段为null时,则取表B的GZ字段内容。
解决方案 »
- 虚拟机下的linux安装oracle 10.2g
- 如何在存储执行中,查询某条sql语句的执行计划。
- 急!!!我更换了ip后oracle数据库启动不了
- 数据累加,SQL怎么实现呢?
- 求~Oracle10G/11G容易上手的好书和视频
- oracle 转移数据到 sql2000 的乱码问题!
- 哪里有oracle9i?
- 在ORACLE中有哪一个函数与SQL SERVER中的convert()函数功能相同,或者怎样实现这个功能?
- oracle9i可以直接生成HTML各式的Report,oracle有没有提供程序接口
- linux下sqlplus无反应
- For i in 20..80 loop(如何设置步长)
- 急!关于exp备份的问题!!!
参考:
SELECT A.NO,
A.ZY,
A.JH,
A.BH,
NVL(A.CHR2, B.GZ),
A.MONEY,
A.NUM1,
A.RQ,
A.YE
FROM A, B
WHERE A.NO = B.NO(+)
A.ZY,
A.JH,
A.BH,
NVL(A.CHR2, B.GZ),
A.MONEY,
A.NUM1,
A.RQ,
A.YE
FROM A left join B
on A.NO = B.NO
A.ZY,
A.JH,
A.BH,
decode(A.CHR2,null, B.GZ,a.CHR2),
A.MONEY,
A.NUM1,
A.RQ,
A.YE
FROM A, B
WHERE A.NO = B.NO(+) 用decode也可以
表A是日志表,表B的所有记录都要往表A插入,
表A和NO和表B的NO字段是关联的,表B往表A插入的记录都是表A中ZY字段为“J”的内容,但是CHR2为空,我就是想,如果表A的CHR2字段为空时,则取表B的GZ字段,谢谢
TA.JH,
TA.BH,
decode(TA.ZY,'J',tb.GZ,'B',ta.chr2),
ROUND(TA.MONEY,2) ,
ROUND(TA.NUM1,2),
TA.RQ,
ROUND( TA.TE,2) FROM A ta,
B tb
WHERE ta.NO=tb.NO(+) AND
TA.ZY IN ('B','J') AND
TA.RQ>=TO_DATE('20080227','YYYYMMDD') AND
TA.RQ<=TO_DATE('20080227','YYYYMMDD')+1
GROUP BY TA.NO,
TA.JH,
TA.INVNO,
decode(TA.ZY,'J',tb.GZ,'B',ta.chr2),
ROUND(TA.MONEY,2) ,
ROUND(TA.NUM1,2),
TA.RQ,
ROUND( TA.YE,2)
这是我写的SQL,执行后,每条记录就会出现重复的的,应该只有7条记录,结果出现了14条记录,
我的意思就是想,如果表A的ZY字段是‘J’时,则取表B的GZ字段,如果是‘B’时,则取表A的CHR2字段
你取的是A表的记录,A,B两个表是主从表的关系,因为靠no来关联的,这时肯定会出现多条记录。
TA.JH,
TA.BH,
decode(TA.ZY,'J',tb.GZ,'B',ta.chr2,null),
ROUND(TA.MONEY,2) ,
ROUND(TA.NUM1,2),
TA.RQ,
ROUND( TA.TE,2) FROM A ta,
B tb
WHERE ta.NO=tb.NO(+) AND
TA.ZY IN ('B','J') AND
TA.RQ>=TO_DATE('20080227','YYYYMMDD') AND
TA.RQ <=TO_DATE('20080227','YYYYMMDD')+1
GROUP BY TA.NO,
TA.JH,
TA.INVNO,
decode(TA.ZY,'J',tb.GZ,'B',ta.chr2,null),
ROUND(TA.MONEY,2) ,
ROUND(TA.NUM1,2),
TA.RQ,
ROUND( TA.YE,2)
这是我写的SQL,执行后,每条记录就会出现重复的的,应该只有7条记录,结果出现了14条记录,
我的意思就是想,如果表A的ZY字段是‘J’时,则取表B的GZ字段,如果是‘B’时,则取表A的CHR2字段我取的这天的原始数据中,表A的CHR2和表B中的GZ都是为NULL ,如果表A的CHR2和表B的GZ都为NULL时,则显示是空
select no , zy , jh , bh
, nvl(a.chr2,(select MAX(b.GZ) from b where a.no=b.no)) , money , num1 , rq ,ye
from a
select no , zy , jh , bh
, nvl(a.chr2,(select b.GZ from b where a.no=b.no and rownum<2)) , money , num1 , rq ,ye
from a