Tuning SQL via case when statement
原SQL如下:SQL的主要问题是红色部分居然通过标量查询,反复的查找与SQL相同的基表,很显然这个可以用case when来简化。 select a.TRAN_ID,a.AMOUNT,a.BALANCE,a.INVAMT,a.PROMISED,a.INVNO,a.RCLNUM,b.PROBLEM_ID, a.TRANTYPE,a.TYPE,a.DUEDATE,a.INVDATE,a.RCLDATE,a.LASTTYPE,a.LOCBAL,a.CUSTNO,b.STATUS,a.PAYMENTS_PENDING, isnull(( SELECT 'Y' FROM GPCOMP1.GPRECL aa with (NOLOCK) LEFT OUTER JOIN GPCOMP1.GPPROB b with (NOLOCK)ON (aa.tran_id = b.open_invoice_tran_id), GPCOMP1.GPTRCTRL c with (NOLOCK) WHERE aa.tran_id = a.tran_id AND aa.trantype = c.trantype AND ( ( c.CAPPLSTRAT = 'Y' AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' )) AND ((c.DAPPLSTRAT = 'Y' AND c.CAPPLSTRAT = 'Y') OR C.SAPPLYSTRAT='Y' OR (C.SAPPLYSTRAT='N' AND aa.INVNO not in (select distinct (invno) from GPCOMP1.GPRECL r with (NOLOCK) where tran_id = (select open_invoice_tran_id from GPCOMP1.GPPROB p with (NOLOCK) where p.open_invoice_tran_id = r.tran_id)))) ) OR ( c.DAPPLSTRAT = 'Y' AND (b.PROBLEM_ID IS NOT NULL AND b.STATUS <> 'C' ) ) ) AND ( ( c.PPAPPLSTRAT = 'Y' AND aa.PAYMENTS_PENDING = 'Y' ) OR ( c.NPPAPPLSTRAT = 'Y' AND aa.PAYMENTS_PENDING != 'Y' ) ) ),'N') as STRATEGIC from GPCOMP1.GPRECL a with (NOLOCK) LEFT OUTER JOIN GPCOMP1.GPPROB b with (NOLOCK) on (b.OPEN_INVOICE_TRAN_ID = a.TRAN_ID)where a.CUSTNO= @P0 order by a.INVNO
changed to
select a.TRAN_ID, a.AMOUNT, a.BALANCE, a.INVAMT, a.PROMISED, a.INVNO, a.RCLNUM, b.PROBLEM_ID, a.TRANTYPE, a.TYPE, a.DUEDATE, a.INVDATE, a.RCLDATE, a.LASTTYPE, a.LOCBAL, a.CUSTNO, b.STATUS, a.PAYMENTS_PENDING, CASE WHEN c.PPAPPLSTRAT = 'Y'AND a.PAYMENTS_PENDING = 'Y'AND c.DAPPLSTRAT = 'Y'AND (b.PROBLEM_ID IS NOT NULL AND b.STATUS <> 'C' ) THEN 'Y' WHEN c.PPAPPLSTRAT = 'Y'AND a.PAYMENTS_PENDING = 'Y'AND c.CAPPLSTRAT = 'Y'AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' ))AND (c.DAPPLSTRAT = 'Y' or C.SAPPLYSTRAT='Y' or (C.SAPPLYSTRAT='N' AND b.open_invoice_tran_id is null)) THEN 'Y' WHEN c.NPPAPPLSTRAT = 'Y'AND a.PAYMENTS_PENDING != 'Y'AND c.DAPPLSTRAT = 'Y'AND (b.PROBLEM_ID IS NOT NULL AND b.STATUS <> 'C' ) THEN 'Y' WHEN c.NPPAPPLSTRAT = 'Y'AND a.PAYMENTS_PENDING != 'Y'AND c.CAPPLSTRAT = 'Y'AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' ))AND (c.DAPPLSTRAT = 'Y' or C.SAPPLYSTRAT='Y' or (C.SAPPLYSTRAT='N' and b.open_invoice_tran_id is null)) THEN 'Y' ELSE 'N' END as STRATEGIC FROM GPCOMP1.GPRECL a LEFT OUTER JOIN GPCOMP1.GPPROB b on (b.OPEN_INVOICE_TRAN_ID = a.TRAN_ID) LEFT OUTER JOIN GPCOMP1.GPTRCTRL c on (c.trantype = a.trantype) where a.CUSTNO= '12345' order by a.INVNO
转载于:https://www.cnblogs.com/princessd8251/p/3847835.html
Tuning SQL via case when statement相关推荐
- 了解SQL Server CASE语句
SQL Server CASE statement is equivalent to the IF-THEN statement in Excel. SQL Server CASE语句等效于Excel ...
- SQL中Case和convert()
SQL语句之 case 和 convert 一.SQL之case 1 1.基本用法 :作为sql语句中的判断条件 case 字段 when 条件1 THEN 结果 Else 结果 END 2.比较用法 ...
- SQL之case when then用法(用于分类统计)
case具有两种格式.简单case函数和case搜索函数. --简单case函数 case sexwhen '1' then '男' when '2' then '女' else '其他' end - ...
- SQL中case的使用方法
Case具有两种格式.简单Case函数和Case搜索函数. 1.简单Case函数 CASE sex WHEN '1' THEN '男'WHEN '2' THEN '女' ELSE '其他' END 2 ...
- SQL语句--CASE函数写法的简单举例,及应用
SQL语句–CASE函数写法的简单举例,及应用 ---case函数的基本结构:case when...then...else... ----可以写也可以不写,按实际需求end [举个栗子_1] eg1 ...
- Case When语句详解SQL中Case When的用法
SQL中case when的用法 case when类似于编程语言中的if else判断.switch case语句.该语句执行时先对条件进行判断,然后根据判断结果做出相应的操作. Case具有两种格 ...
- 【SQL中case then的用法】
SQL中case then的用法 当我们需要从数据源上直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用CASE THEN这个函数了. 其中case then有两种格式: 1.第一种 ...
- 关于sql中case when的用法
Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...
- case when用法java,sql之case when用法详解
简单CASE WHEN函数只能应对一些简单的业务场景,而CASE WHEN条件表达式的写法则更加灵活. CASE WHEN条件表达式函数:类似JAVA中的IF ELSE语句. 简单CASE WHEN函 ...
最新文章
- eplan文本怎么换行_JDK 14的新特性:文本块Text Blocks
- 《炉石传说》的退环境机制失败在哪
- c++十进制转二进制_二进制与十进制如何互相转换?
- 前端学习(2636):文件缺失
- python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)
- 大数据之HBase部署
- 迁移Exchange Server 2003
- Linux服务器配置和管理:虚拟机安装CentOS6.7
- 图标字体制作,mock数据
- 洛谷——P1548 [NOIP1997 普及组] 棋盘问题
- 大数据将植物学研究带入新境界
- VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multi
- java获取mysql表的主键_用java如何获取oracle数据库表里面的主键序列
- Can you answer these queries? HDU 4027 线段树
- 【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)
- 新主播如何在直播行业混得好
- 吊打何同学?猛肝24小时,用6000元成本打造 AirDesk!
- 【习题5】用Python完成新建文档写古诗+复制
- matlab在量子力学中的应用,一个关于量子力学中的matlab的问题
- kml文件转成cvs_KML 转图层 (转换)
热门文章
- 思科、华为、Juniper命令对比
- session过期重新登陆_深入分析Session和Cookie-前端面试题
- Seata-AT 如何保证分布式事务一致性
- 函数粘合云服务提供端到端解决方案
- linux运维技巧,Linux运维需要掌握的17个实用技巧
- seaborn常用图
- Mybatis-增删改查模糊查询分页注解(普通类型参数、引用类型参数、Map类型参数)
- tftp的c语言实现,GitHub - ideawu/tftpx: TFTP server and client implementation in C
- oracle rcu 安装,Oracle Fusion MiddlewareⅠ: 数据库和RCU
- 长方体重力异常正演matlab,骆遥 (2007) 两种新的长方体重力异常正演公式及其理论推导. 中国科学院地质与地球物理研究所, 北京....