Oracle系列工作总结

1.EXISTS用法错误注意

错误代码:
SELECT A.*
FROM TABLE1 A
LEFT JOIN TABLE2 B
ON EXISTS (SELECT 1
FROM TABLE3 C
WHERE C.YHBH = B.YHBH
AND C.YHZTDM = ‘1’
AND (CASE
WHEN A.XLTQBZ = ‘1’ THEN
C.YHLBDM = ‘110’
WHEN A.XLTQBZ = ‘2’ THEN
C.YHLBDM = ‘120’
ELSE
NULL
END
))
WHERE A.NY = 2019;

总结:case when 条件 then 值,then的后面是值,不是表达式,如果放在where条件后面需要写成表达式加值的形式。

正确代码:

SELECT A.*
  FROM TABLE1 A
  LEFT JOIN TABLE2 B
    ON EXISTS (SELECT 1
          FROM TABLE3 C
         WHERE C.YHBH = B.YHBH
           AND C.YHZTDM = '1'
           AND  C.YHLBDM =(CASE
                 WHEN A.XLTQBZ = '1' THEN
                   '110'
                 WHEN A.XLTQBZ = '2' THEN
                   '120'
                 ELSE
                  NULL
               END))
 WHERE A.NY = 2019;

2.LEFT JOIN ON执行速度

慢:

SELECT  a.*
  FROM TABLE1 a
  left join TABLE2 b
    ON  a.bs=b.bs
    and  exists (SELECT 1
          FROM TABLE3 c
         WHERE c.yhbh = b.yhbh
           and c.dq = b.dq
           and c.yhlbdm = '120'
           and c.yhztdm = '1')
 WHERE a.ny = 2019
   and a.xltqbz = '2'  ;

总结: 将exist的条件放在ON后面比放在where后面要慢得多(具体执行速度原因还未研究,后续补充)

快:

 SELECT  a.*
      FROM TABLE1 a
      left join TABLE2 b
        ON  a.bs=b.bs
     WHERE a.ny = 2019
       and a.xltqbz = '2' 
       and  exists (SELECT 1
              FROM TABLE3 c
             WHERE c.yhbh = b.yhbh
               and c.dq = b.dq
               and c.yhlbdm = '120'
               and c.yhztdm = '1') ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值