原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= '' order by a.INVNO

Tuning SQL via case when statement的更多相关文章

  1. SQL利用Case When Then多条件判断SQL 语句

    http://www.cnblogs.com/kevin2013/archive/2010/07/02/1769682.html SQL利用Case When Then多条件判断SQL ,用于sele ...

  2. 关于sql的case when用法简述

    刚入手公司项目,需要添加一个功能,用到了SQL的case when以及concat SELECT eve.cc, eve.sc, case concat(cc,sc) ' THEN '' ' THEN ...

  3. SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)

    SQL Fundamentals || Oracle SQL语言 Capabilities of the SELECT Statement(SELECT语句的功能) Data retrieval fr ...

  4. SQL之case when then用法

    case具有两种格式.简单case函数和case搜索函数. 按 Ctrl+C 复制代码 这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限 ...

  5. sql中case when语句的使用-来自网摘文章

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

  6. SQL中case when then用法

    sql语句判断方式之一Case.具有两种格式:简单的Case函数.Case搜索函数. 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' E ...

  7. SQL利用Case When Then多条件判断

    CASE     WHEN 条件1 THEN 结果1     WHEN 条件2 THEN 结果2     WHEN 条件3 THEN 结果3     WHEN 条件4 THEN 结果4 ....... ...

  8. sql 中 case when 语法(转)

    sql语言中有没有类似C语言中的switch case的语句?? 没有,用case   when   来代替就行了.            例如,下面的语句显示中文年月         select ...

  9. SQL中Case的使用方法(下篇)(转)

    接上篇 四,根据条件有选择的UPDATE. 例,有如下更新条件 工资5000以上的职员,工资减少10% 工资在2000到4600之间的职员,工资增加15% 很容易考虑的是选择执行两次UPDATE语句, ...

随机推荐

  1. 解决EasyUI-Datagrid和LinqToEntity结合应用时排序问题

    我们在做WEB页面时,时常会选择JQuery框架的Datagrid,如Ext.EasyUI.Flexigrid,数据访问则采用LinqToSQL或LinqToEntity.UI用Jquery框架的目的 ...

  2. hdu A计划

    这道题是一道bfs的题目,因为题目中给的数据很小,所以可以采用优先队列的方式来简化处理.这道题在搜索的过程中要注意map1的不同层次的转换,即对'#'的理解.之前wa了两次是因为我考虑了如果上下两层对 ...

  3. Hadoop如何恢复被删除的文件

    hadoop的hdfs中被删除文件的恢复原理和回收站原理是一样的,就是在删除hdfs文件时,被删除的文件被移动到了hdfs的.Trash文件夹中,恢复时只需将该文件夹中文件拿出即可.具体操作如下: 1 ...

  4. dig理解DNS的解析过程 - 阿权的书房

    关于DNS的常识,可以阅读附录的一些参考资料.本文旨在尝试举例用dig命令理解这个过程,并非权威知识,仅供参考.测试域名为阿权的书房的域名 www.aslibra.com 和 www.163.com. ...

  5. ElasticSearch实战-日志监控平台

    1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件——ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...

  6. 小组项目alpha发布的评价

    新蜂团队一直都特别努力,这节课我也看到了他们努力的结果--项目可以顺利运行,在两个同学试玩期间没有出现BUG,不知道玩游戏的同学的心情,反正我们在台下看得很开心的. 飞天小女警组的礼物挑选系统,是一个 ...

  7. 自定义view实现侧滑菜单

    自定义View public class SlidingMenu extends HorizontalScrollView { private int mScreenWidth; private in ...

  8. C#winform项目添加引用编译文件

    打开opencv(Emgu for windows)样例,发现有带引用图标的文件 以前还真没见过这种用法,研究了一下: 1.项目版本信息文件内容及添加: 通过修改项目目录下的csproj(c shar ...

  9. 20145235 《Java程序设计》第4周学习总结

    代码托管截图 教材学习内容总结 继承 •继承:继承基本上就是避免多个类间重复定义共同行为. 我理解的就是:在编写程序的过程中可能会出现部分代码重复的现象,把重复的部分单独定义为一类(父类),在其他代码 ...

  10. MySQL服务器状态变量

    一,最值得检查的状态变量使用show global status进行检测二.变量部分1.Aborted_clients如果这个变量持续增加,确定连接是否被关闭了.如果不是检查网络性能,并且检查max_ ...