Oracle一个语句多个left,oracle 多个 left join

场景:Oracle中SQL优化:left join查询语句,多个字段关联同一个表有关问题

Oracle中SQL优化:left join查询语句,多个字段关联同一个表问题

tabA表,

此表字段:

code1,code2,code3

tabB表:

此表字段:

id,code,codeName

查询:

select

b1.codeName,

b2.codeName,

b3.codeName

from tabA a

left join tabB b1

on a.code1=b1.code

left join tabB b2

on a.code2=b2.code

left join tabB b3

on a.code3= b3.code

where 1=1

这种查询,对于tabB表扫描次数太频繁,请问如何更改比较合理。

------解决思路----------------------

表A三个字段看起来好像一样啊,为什么不用一个字段就行?

------解决思路----------------------

列转行,再行转列,B表访问次数少了

但是至于那个执行时间快,不确定,具体执行下或看一下执行计划吧

SELECT MAX(DECODE(A.CONAME,'code1',B.codeName)),

MAX(DECODE(A.CONAME,'code2',B.codeName)),

MAX(DECODE(A.CONAME,'code3',B.codeName))

FROM

(select code1 as code,'code1' as colname,rowid as id from TABLEA

union all

select code2 as code,'code2' as colname,rowid as id from TABLEA

union all

select code3 as code,'code3' as colname,rowid as id from TABLEA) A,TABLEB B

WHERE A.CODE=B.CODE

GROUP BY A.ID

------解决思路----------------------

这是要干嘛,看着都不通

------解决思路----------------------

引用:这很简单嘛,比如一个单据表有 批准人,审核人,复审核人

而这些人肯定都是对应的员工表。那么查询的时候自然就要关联一下,只是这个sql关联的有些多了。

如果是这样的表,考虑一下改成由person_name,person_identity和document_id三个字段组成的表如何,类似的你的表也可以改改嘛。只是个想法,可以试试

------解决思路----------------------

b表很大吗?b.code应该有唯一索引的吧,这样应该问题也不大

------解决思路----------------------

引用:这很简单嘛,比如一个单据表有 批准人,审核人,复审核人

而这些人肯定都是对应的员工表。那么查询的时候自然就要关联一下,只是这个sql关联的有些多了。

要么重新设计表,要么行列转换。

------解决思路----------------------

select

(case when a.code1=b1.code then b1.codename end),

(case when a.code1=b1.code then b1.codename end),

(case when a.code1=b1.code then b1.codename end)

from tabA a

left join tabB b1

on (a.code1=b1.code or a.code2=b1.code or a.code3= b1.code)

------解决思路----------------------

4楼的方法可以测一下,速度有没有提升.

楼主原本的语句,如果每次经过where筛选后,数据量不大,在tabB的code上加个索引就差不多了

------解决思路----------------------

--如果满足要求的话 楼主看看这个

SELECT code1, code2, code3, wm_concat(t2.name)

FROM t t1

LEFT JOIN tb t2

ON (t1.code1 = t2.code OR t1.code2 = t2.code OR t1.code3 = t2.code)

GROUP BY code1, code2, code3

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值