1. SQL如下:SQL的主要问题是红色部分居然通过标量查询,反复的查找与SQL相同的基表,很显然这个可以用case when来简化。
  2.  
  3. select
    a.TRAN_ID,
    a.AMOUNT,
    a.BALANCE,
    a.INVAMT,
    a.PROMISED,
    a.INVNO,
    a.RCLNUM,
    b.PROBLEM_ID,
  4. a.TRANTYPE,
    a.TYPE,
    a.DUEDATE,
    a.INVDATE,
    a.RCLDATE,
    a.LASTTYPE,
    a.LOCBAL,
    a.CUSTNO,
    b.STATUS,
    a.PAYMENTS_PENDING,

  5. isnull(( SELECT 'Y' FROM GPCOMP1.GPRECL aa with (NOLOCK) LEFT OUTER JOIN GPCOMP1.GPPROB b with (NOLOCK)
  6.  
  7. ON (aa.tran_id = b.open_invoice_tran_id), GPCOMP1.GPTRCTRL c with (NOLOCK) WHERE aa.tran_id = a.tran_id
  8.  
  9. AND aa.trantype = c.trantype AND ( ( c.CAPPLSTRAT = 'Y'
  10.  
  11. AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' ))
  12.  
  13. AND ((c.DAPPLSTRAT = 'Y' AND c.CAPPLSTRAT = 'Y') OR C.SAPPLYSTRAT='Y' OR (C.SAPPLYSTRAT='N' AND
  14.  
  15. aa.INVNO not in (select distinct (invno) from GPCOMP1.GPRECL r with (NOLOCK)
  16.  
  17. 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
  18.  
  19. from GPCOMP1.GPRECL a with (NOLOCK) LEFT OUTER JOIN GPCOMP1.GPPROB b with (NOLOCK) on (b.OPEN_INVOICE_TRAN_ID = a.TRAN_ID)
  20.  
  21. where a.CUSTNO= @P0 order by a.INVNO

changed to

  1. select
  2. a.TRAN_ID,
  3. a.AMOUNT,
  4. a.BALANCE,
  5. a.INVAMT,
  6. a.PROMISED,
  7. a.INVNO,
  8. a.RCLNUM,
  9. b.PROBLEM_ID,
  10. a.TRANTYPE,
  11. a.TYPE,
  12. a.DUEDATE,
  13. a.INVDATE,
  14. a.RCLDATE,
  15. a.LASTTYPE,
  16. a.LOCBAL,
  17. a.CUSTNO,
  18. b.STATUS,
  19. a.PAYMENTS_PENDING,
  20. CASE
  21. WHEN c.PPAPPLSTRAT = 'Y'
  22. AND a.PAYMENTS_PENDING = 'Y'
  23. AND c.DAPPLSTRAT = 'Y'
  24. AND (b.PROBLEM_ID IS NOT NULL AND b.STATUS <> 'C' )
  25. THEN 'Y'
  26. WHEN c.PPAPPLSTRAT = 'Y'
  27. AND a.PAYMENTS_PENDING = 'Y'
  28. AND c.CAPPLSTRAT = 'Y'
  29. AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' ))
  30. AND (c.DAPPLSTRAT = 'Y' or C.SAPPLYSTRAT='Y' or (C.SAPPLYSTRAT='N' AND b.open_invoice_tran_id is null))
  31. THEN 'Y'
  32. WHEN c.NPPAPPLSTRAT = 'Y'
  33. AND a.PAYMENTS_PENDING != 'Y'
  34. AND c.DAPPLSTRAT = 'Y'
  35. AND (b.PROBLEM_ID IS NOT NULL AND b.STATUS <> 'C' )
  36. THEN 'Y'
  37. WHEN c.NPPAPPLSTRAT = 'Y'
  38. AND a.PAYMENTS_PENDING != 'Y'
  39. AND c.CAPPLSTRAT = 'Y'
  40. AND (b.PROBLEM_ID IS NULL OR (b.PROBLEM_ID IS NOT NULL AND b.STATUS = 'C' ))
  41. AND (c.DAPPLSTRAT = 'Y' or C.SAPPLYSTRAT='Y' or (C.SAPPLYSTRAT='N' and b.open_invoice_tran_id is null))
  42. THEN 'Y'
  43. ELSE 'N'
  44. END as STRATEGIC
  45. FROM GPCOMP1.GPRECL a
  46. LEFT OUTER JOIN GPCOMP1.GPPROB b on (b.OPEN_INVOICE_TRAN_ID = a.TRAN_ID)
  47. LEFT OUTER JOIN GPCOMP1.GPTRCTRL c on (c.trantype = a.trantype)
  48. 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. Response.Write 打开新窗口

    Response.Write 打开新窗口 string url=" XXX.aspx?aaa="+bbb"; Response.Write(" <scri ...

  2. Easyui的datagrid结合hibernate实现数据分页

    最近在学习easyui的使用,在学到datagrid的时候遇到了一些问题,终于抽点时间整理了一下,分享出来,请各位前辈高手多多指教! 1.先来看看效果,二话不说,上图直观! 2.easyui的data ...

  3. SPIE Example References

    Journal Article[1] Davis, A. R., Bush, C., Harvey, J. C. and Foley, M. F., "Fresnel lenses in r ...

  4. lvs原理和实战

     lvs-dr原理 lvs-nat原理:  当我们的网站流量越来越大时一台web服务器已经无法满足需求了,我们该如何解决呢??把服务器连接起来实现负载均衡或许是个不错的办法..下面我就来看看怎么实现吧 ...

  5. php页面之间传值

    echo("<script>window.open('2.php?head=".$head."');<script>");

  6. OpenCV学习笔记——多种Smooth平滑处理

    opencv库提供了好几种模糊平滑Smooth操作的类型作为cvSmooth的参数传入,从而达到不同的平滑效果,另外复习了一下如何复制一份图像和重新调整图像大小. 调整图像大小目前是按照一下步骤进行: ...

  7. SQL阻止保存要求重新创建表的更改 在哪里设置

    ef生成的数据表,有数据,设计的时候,想把某个字段改成可为null. 报 “阻止保存要求重新创建表”错误 百度一下: 修改数据库表结构时提示[不允许保存更改.您所做的更改要求删除并重新创建以下表.您对 ...

  8. 用MSoffice里的绘图工具

    试过一些绘图表的工具,在xbeta推荐的替代visio一文中介绍的一些软件.之前用得最多的就是Dia,在linux下也有.现在才发现在微软的office下的绘图工具已经足够我使用了,不需要专业的图形符 ...

  9. PHP 开启短标签

    <?=STATIC_URL?> 让上面的语句可以正常运行,等同于下面的语句 <?php echo STATIC_URL;?> 可以在 php.ini 中找到 short_ope ...

  10. Find命令搜索过去一段时间内修改过的文件

    Find命令搜索过去一段时间内修改过的文件 服务器  kxjhwbb  12个月前 (10-22)  342℃  0评论 有些时候我们需要查找一些最近修改过的文件,比如改着改着忘了自己改过什么= = ...