原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相关推荐

  1. 了解SQL Server CASE语句

    SQL Server CASE statement is equivalent to the IF-THEN statement in Excel. SQL Server CASE语句等效于Excel ...

  2. SQL中Case和convert()

    SQL语句之 case 和 convert 一.SQL之case 1 1.基本用法 :作为sql语句中的判断条件 case 字段 when 条件1 THEN 结果 Else 结果 END 2.比较用法 ...

  3. SQL之case when then用法(用于分类统计)

    case具有两种格式.简单case函数和case搜索函数. --简单case函数 case sexwhen '1' then '男' when '2' then '女' else '其他' end - ...

  4. SQL中case的使用方法

    Case具有两种格式.简单Case函数和Case搜索函数. 1.简单Case函数 CASE sex WHEN '1' THEN '男'WHEN '2' THEN '女' ELSE '其他' END 2 ...

  5. SQL语句--CASE函数写法的简单举例,及应用

    SQL语句–CASE函数写法的简单举例,及应用 ---case函数的基本结构:case when...then...else... ----可以写也可以不写,按实际需求end [举个栗子_1] eg1 ...

  6. Case When语句详解SQL中Case When的用法

    SQL中case when的用法 case when类似于编程语言中的if else判断.switch case语句.该语句执行时先对条件进行判断,然后根据判断结果做出相应的操作. Case具有两种格 ...

  7. 【SQL中case then的用法】

    SQL中case then的用法   当我们需要从数据源上直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用CASE THEN这个函数了.   其中case then有两种格式: 1.第一种 ...

  8. 关于sql中case when的用法

    Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...

  9. case when用法java,sql之case when用法详解

    简单CASE WHEN函数只能应对一些简单的业务场景,而CASE WHEN条件表达式的写法则更加灵活. CASE WHEN条件表达式函数:类似JAVA中的IF ELSE语句. 简单CASE WHEN函 ...

最新文章

  1. eplan文本怎么换行_JDK 14的新特性:文本块Text Blocks
  2. 《炉石传说》的退环境机制失败在哪
  3. c++十进制转二进制_二进制与十进制如何互相转换?
  4. 前端学习(2636):文件缺失
  5. python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)
  6. 大数据之HBase部署
  7. 迁移Exchange Server 2003
  8. Linux服务器配置和管理:虚拟机安装CentOS6.7
  9. 图标字体制作,mock数据
  10. 洛谷——P1548 [NOIP1997 普及组] 棋盘问题
  11. 大数据将植物学研究带入新境界
  12. VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multi
  13. java获取mysql表的主键_用java如何获取oracle数据库表里面的主键序列
  14. Can you answer these queries? HDU 4027 线段树
  15. 【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)
  16. 新主播如何在直播行业混得好
  17. 吊打何同学?猛肝24小时,用6000元成本打造 AirDesk!
  18. 【习题5】用Python完成新建文档写古诗+复制
  19. matlab在量子力学中的应用,一个关于量子力学中的matlab的问题
  20. kml文件转成cvs_KML 转图层 (转换)

热门文章

  1. 思科、华为、Juniper命令对比
  2. session过期重新登陆_深入分析Session和Cookie-前端面试题
  3. Seata-AT 如何保证分布式事务一致性
  4. 函数粘合云服务提供端到端解决方案
  5. linux运维技巧,Linux运维需要掌握的17个实用技巧
  6. seaborn常用图
  7. Mybatis-增删改查模糊查询分页注解(普通类型参数、引用类型参数、Map类型参数)
  8. tftp的c语言实现,GitHub - ideawu/tftpx: TFTP server and client implementation in C
  9. oracle rcu 安装,Oracle Fusion MiddlewareⅠ: 数据库和RCU
  10. 长方体重力异常正演matlab,骆遥 (2007) 两种新的长方体重力异常正演公式及其理论推导. 中国科学院地质与地球物理研究所, 北京....