zoukankan      html  css  js  c++  java
  • Oracle 表关联性 Update 语句的改写,推荐改写方法1

    同事写了一个逻辑稍复杂的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)

     

  • 相关阅读:
    ( 转 ) Mysql group_concat 的反向应用实现(Mysql列转行)
    ( 转 ) 优化 Group By -- MYSQL一次千万级连表查询优化
    ( 转 ) mysql复合索引、普通索引总结
    ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点
    ( 转 ) mysql 实战 or、in与union all 的查询效率
    ( 转 ) MySQL高级 之 explain执行计划详解
    ( 转 ) UML 类图
    ( 转 ) .net 操作 JWT
    windows 常用命令
    windows 执行bat脚本
  • 原文地址:https://www.cnblogs.com/flyingsanddream/p/10795659.html
Copyright © 2011-2022 走看看