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)
Oracle 表关联性 Update 语句的改写,推荐改写方法1的更多相关文章
- ORACLE多表关联UPDATE 语句
转载至:http://blog.itpub.net/29378313/viewspace-1064069/ 为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQ ...
- ORACLE 多表关联 UPDATE 语句
为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id num ...
- ORACLE多表关联UPDATE 语句[z]
[z]https://www.cnblogs.com/franson-2016/p/5988303.html 1) 最简单的形式 SQL 代码 --经确认customers表中所有customer_i ...
- Oracle存储过程执行update语句不报错不生效问题
转载链接:http://lin49940.iteye.com/blog/466626 今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会 ...
- SQL:查找被锁的表,以及锁表的SQL语句(重点推荐)
--死锁检测 use master Select * --找到SPID exec sp_lock --根据SPID找到OBJID ) --根据OBJID找到表名 1.DatabaseName 同于你要 ...
- oracle 表空间常用语句
–查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...
- oracle表空间操作语句
1.查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from dba_data_files group by ...
- 常用oracle表空间查询语句
--查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...
- Oracle 表空间不足引起的问题及解决方法
-- 1 向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的: 查询表空间使用情况语句 select a.tablesp ...
随机推荐
- 星型打分插件 bootstrap-rating-input
最近帮人实现一个打分的功能,发现bootstrap-rating-input是个简单又好用的星型打分,我对其做了些定制,添加了分值说明,并修改了样式,毕竟 bootstrap 自身的黑色五角星还是不够 ...
- Asp.net 的工作原理
转:http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html 1.1.1 Asp.net 的工作原理 ...
- 在Ubuntu 16.04如何安装Java使用apt-get的
转自:https://www.howtoing.com/how-to-install-java-with-apt-get-on-ubuntu-16-04/ 的Java和JVM(Java的虚拟机)是广泛 ...
- Redis AOF 全持久化
简介: Redis AOF 持久化,将每次接收到更改 redis 数据的操作都记录到一个 aof 文件,当服务器意外宕机或 redis 服务器非法关闭时,不会丢失数据. 可以做到数据安全化,但是性能会 ...
- 修改 cmd 控制台字体、巧用 FontLink 使中英文独立设置
众所周知,Windows 中 cmd 控制台窗口的字体难看,但是修改注册表是可以实现修改其字体的,但很多很棒的编程字体是没有中文的,所以在显示中文时直接调用了宋体,这绝妙的反差实在是 不忍直视.但是, ...
- zabbix自定义key监控nginx和fpm(网站并发数)
一. nginx编译参数 监控nginx,主要讲解监控并发数 --prefix=/usr/local/nginx --with-http_stub_status_module zabbix编译参数的查 ...
- CS API 测试2
//删除数据中心 http://192.168.150.16:8900/client/api?command=deleteZone&id=c2d4f46a-51af-4806-8378-4b3 ...
- 心理学轨迹及AI基础理论读后感
今天简单的看了下心理学轨迹及AI基础理论发现世界确实是那3%的人改变的,我等屁民还努力在红尘中争渡,下面简单记录下我刚看完的思路,算做个笔记给自己看.. 模型建立的最终结果可以解读所有的心理学现象,可 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- Verifying Package Integrity Using MD5 Checksums or GnuPG
In this note, I reference the MySQL manual file. After downloading the MySQL package that suits your ...