同事写了一个逻辑稍复杂的Update 语句,觉得在代码可读性上有些转圈,交给我帮忙改下。

以下根据原SQL,使用两种方法进行改写,个人推荐方法1的改写。方法2拆分两个SQL来写,代码可读性最强,但是SQL扩展上不利,推荐方法1的改写.

原SQL:

UPDATE z_delivery_orders a
     SET dtheday2 = a.dtheday2  +
               (SELECT c.add_dt
                FROM ud_cfg_firmdt c
                  WHERE c.add_inv_type = (CASE WHEN

            a.VBELN IN (SELECT VBELN FROM Z_MID_PCDW_SO b WHERE b.zcustseg = 'WEB')

            THEN 'A'
            ELSE
                                           'B'
                                           END)) )
     WHERE a.dtheday2 IS NOT NULL;

update SQl 本身是没有问题的,逻辑也是符合要求,且不说表的设计上是否合理,单从SQL的改写上着手做增强。

改写1:

MERGE INTO z_delivery_orders a

USING (select rowid as row_id,

(CASE

WHEN VBELN IN (SELECT VBELN

FROM Z_MID_PCDW_SO b

WHERE b.zcustseg = 'WEB') THEN

'A'

ELSE

'B'

END) as type_1

from z_delivery_orders

WHERE dtheday2 IS NOT NULL ) b

ON (a.rowid = b.row_id)

WHEN MATCHED THEN

UPDATE

SET a.dtheday2 =

(SELECT  a.dtheday2  + nvl(max(add_dt), 0)  as dtheday2

FROM ud_cfg_firmdt

WHERE add_inv_type = b.type_1);

改写2:拆分两个SQL来写,代码可读性最强,但是SQL扩展上不利,推荐方法1的改写

UPDATE z_delivery_orders a

SET dtheday2 =  dtheday2  +

(SELECT add_dt

FROM ud_cfg_firmdt

WHERE add_inv_type = ’A'

and rownum = 1)

WHERE dtheday2 IS NOT NULL

AND exists (select 1

from Z_MID_PCDW_SO b

WHERE b.zcustseg = 'WEB'

and a.vbeln = b.vbeln);

UPDATE z_delivery_orders a

SET dtheday2 = dtheday2, +

(SELECT add_dt

FROM ud_cfg_firmdt

WHERE add_inv_type = 'B'

and rownum = 1)

WHERE dtheday2 IS NOT NULL

AND not exists (select 1

from Z_MID_PCDW_SO b

WHERE b.zcustseg = 'WEB'

and a.vbeln = b.vbeln)

Oracle 表关联性 Update 语句的改写,推荐改写方法1的更多相关文章

  1. ORACLE多表关联UPDATE 语句

    转载至:http://blog.itpub.net/29378313/viewspace-1064069/ 为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQ ...

  2. ORACLE 多表关联 UPDATE 语句

    为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id num ...

  3. ORACLE多表关联UPDATE 语句[z]

    [z]https://www.cnblogs.com/franson-2016/p/5988303.html 1) 最简单的形式 SQL 代码 --经确认customers表中所有customer_i ...

  4. Oracle存储过程执行update语句不报错不生效问题

    转载链接:http://lin49940.iteye.com/blog/466626 今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会 ...

  5. SQL:查找被锁的表,以及锁表的SQL语句(重点推荐)

    --死锁检测 use master Select * --找到SPID exec sp_lock --根据SPID找到OBJID ) --根据OBJID找到表名 1.DatabaseName 同于你要 ...

  6. oracle 表空间常用语句

    –查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...

  7. oracle表空间操作语句

    1.查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from dba_data_files group by ...

  8. 常用oracle表空间查询语句

    --查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...

  9. Oracle 表空间不足引起的问题及解决方法

    -- 1 向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的: 查询表空间使用情况语句 select a.tablesp ...

随机推荐

  1. C#如何消除绘制图形缩放时抖动,总结

    一.手动双缓冲 首先定义一个BitmapBitmap backBuffer = new Bitmap(画布宽度, 画布高度);然后获取这个Bitmap的GraphicsGraphics graphic ...

  2. 查看win激活状态的命令

    查看win激活状态的命令  1.键盘按下win+R 运行输入如下命令即可. 2.Win+R===>输入 slmgr.vbs -dlv   显示:最为详尽的激活信息,包括:激活ID.安装ID.激活 ...

  3. Python 位运算符 逻辑运算符 成员运算符

    位运算符 运算符 描述 实例 & 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果12 ,二进制解释:0000 1100 | ...

  4. 更改AD域安全策略-密码必须符合复杂性要求

    在域环境中,修改域用户密码时,会提示不符合密码策略, 更改"本地安全策略"是不会对域产生任何的作用的. 上图中可以看,这里按钮都是灰色的! 下面这个步骤教你如何找到"域安 ...

  5. 基于 DirectX11 的 MMDViewer 01-简介

    这个项目主要是为了 DirectX11 而来,前面做了一个关于 OpenGL 的项目,这次打算使用 DirectX11 来做一个 MMD 的模型浏览器.以前,我使用过 DirectX11 来做过一些项 ...

  6. Fatal error: Class 'MongoDB\Driver\Manager' not found

    折腾了好久,总算找到了问题所在! 首先!!检查你安装的PHP拓展版本是否正确,能在在phpinfo()中看到拓展,若看不到,则安装错误! 其次,我在安装PHP扩展的时候,安装的是mongo拓展,如下图 ...

  7. 网络编程基础之Socket套接字简单应用

    一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...

  8. Perl 变量:标量变量

    Perl 标量标量是一个简单的数据单元.标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页. 1.数字标量标量通常是一个数字或字符串. 2.字符串标量以下实例演示了不同类型的字符串标量的 ...

  9. C#使用NPOI导出excel设置单元格背景颜色

    ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.FillPattern = FillPattern.SolidForegrou ...

  10. Vue+WebPack游戏设计:自动背景贴图和游戏主循环的实现