暂无图片
oracle left join 问题
我来答
分享
helloword
2023-03-10
oracle left join 问题

oracle 19c 版本

问题如下

A 表  数据如下

subj_cd subj_nm
100101 a
100102 b
100103 c

B表数据

subj_cd cur_bal
1001 10
100101 20

A表为主表,left join b 表  当a. subj_cd 存在b.subj_cd表中直接取b.cur_bal  

  当 a.subj_cd 不在b.sub_cd 取上一级科目余额(即取1001的余额)。

请问如何实现?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
Et

可以使用 Oracle 19c 中的 COALESCE 和 LAG 函数来实现

SELECT a.subj_cd, a.subj_nm, COALESCE(b.cur_bal, c.cur_bal) AS cur_bal FROM A a LEFT JOIN B b ON a.subj_cd = b.subj_cd LEFT JOIN B c ON a.subj_cd LIKE c.subj_cd || '%' AND LENGTH(a.subj_cd) > LENGTH(c.subj_cd) ORDER BY a.subj_cd;

复制

在上面的 SQL 语句中,使用 LEFT JOIN 关键字将表 A 和表 B 进行联接。使用 COALESCE 函数来确定表 B 中存在的 cur_bal 或者使用表 C 中的 cur_bal,因为表 C 中包含上一级科目信息。使用 LAG 函数来在表 C 中访问上一行的 cur_bal。

暂无图片 评论
暂无图片 有用 1
打赏 0
暂无图片
helloword
题主
2023-03-10
谢谢
刘晓华

drop table t_a;
drop table t_b;
create table t_a(
subj_cd varchar2(8),
subj_nm varchar2(10));

create table t_b(
subj_cd varchar2(8),
cur_bal number(3,1));

insert into t_a values('100101','a');
insert into t_a values('100102','b');
insert into t_a values('100103','c');
insert into t_b values('1001',10);
insert into t_b values('100101',20);
commit;

select subj_cd,subj_nm,cur_bal
from (
select a.subj_cd,a.subj_nm,a.p1,nvl(a.cur_bal,b.cur_bal) as cur_bal
from (
select a.subj_cd,a.subj_nm,substr(a.subj_cd,1,4) as p1,b.cur_bal
from t_a a,t_b b
where a.subj_cd = b.subj_cd(+)
) a,t_b b
where a.p1(+) = b.subj_cd
)
where subj_cd is not null



   

暂无图片 评论
暂无图片 有用 0
打赏 1
helloword

谢谢

暂无图片 评论
暂无图片 有用 0
打赏 0
Thomas

我只是有个疑问,范例数据只有两个层次,1001和100101。那实际数据是仅有两个层次吗?如果是1001,100101,10010101三个层次,那么如果B表中无10010101的记录,但有1001和100101记录各一条,用LEFT JOIN B c ON a.subj_cd LIKE c.subj_cd || '%' AND LENGTH(a.subj_cd) > LENGTH(c.subj_cd)来匹配的话,会匹配出两条记录来,怎么处理?按业务逻辑,应该取100101那条才对吧?

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
oracle查询所有连接会话sql是啥?19c多租户环境。
回答 1
已采纳
SELECTs.instid,s.sid,s.serial,s.username,s.osuser,s.machine,s.program,TOCHAR(s.logontime,&x27;YYYYMM
oracle ocp关于赋权的一个考题 with admin option,该选什么?
回答 3
选ABCD  createsession权限就就可以登录数据库了。考试时要是遇到的话建议C就不要选了,他的本意就是考你WITHADMINOPTION
oracle19c创建完用户登录不了一直报ORA-01017: 用户名/口令无效; 登录被拒绝
回答 6
请问最终如何解决的呢?我碰到同样的问题
19c安装报错ins-32070,有人遇到过吗
回答 2
已采纳
sugridcd$ORACLEHOMErmrf.opatchautostorage/rmrf.patchstorage/
Patch 30869156 rollback (pdb HR92XXX): WITH ERRORS
回答 1
18c开始添加了hadoop相关的功能,你可以试试先单独把这个脚本打了cathive1.sql该脚本仅在Linux和SolarisSPARC上调用,而Windows不调用,导致补丁中其他的相关的对象无
oracle 19c 导入18cXE impdp报错
回答 5
VERSION18.1.0.0.0这样写试过么
oracle 19c rac vip和csan问题
回答 1
查安装文档,有问题
第三方要抽取数据库的数据,账号怎么创建
回答 2
你要求每个的话,就要求在CDB建立用户。比如ogg连接oracle就是要c的用户。
生产环境oracle 三节点RAC出现节点宕机情况
回答 4
操作的整个过程命令贴出来看看,另外RHEL的一些东西有没有提前关闭,比如NUMA之类的。日志里面看到的节点剔除,看起来像网络问题但以我的经验,并非一定就是,因为只要节点因为某种原因无法正常通信,它就会
BTRobot 巡检 Oracle 19C rac 两节点集群卡住的问题
回答 1
BTRobot这是个啥东东?