暂无图片
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
暂无图片
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
helloword

谢谢

暂无图片 评论
暂无图片 有用 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
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏