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= '' order by a.INVNO
Tuning SQL via case when statement的更多相关文章
- SQL利用Case When Then多条件判断SQL 语句
http://www.cnblogs.com/kevin2013/archive/2010/07/02/1769682.html SQL利用Case When Then多条件判断SQL ,用于sele ...
- 关于sql的case when用法简述
刚入手公司项目,需要添加一个功能,用到了SQL的case when以及concat SELECT eve.cc, eve.sc, case concat(cc,sc) ' THEN '' ' THEN ...
- SQL Fundamentals: Basic SELECT statement基本的select语句(控制操作的现实列)(FROM-SELECT)
SQL Fundamentals || Oracle SQL语言 Capabilities of the SELECT Statement(SELECT语句的功能) Data retrieval fr ...
- SQL之case when then用法
case具有两种格式.简单case函数和case搜索函数. 按 Ctrl+C 复制代码 这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限 ...
- sql中case when语句的使用-来自网摘文章
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- SQL中case when then用法
sql语句判断方式之一Case.具有两种格式:简单的Case函数.Case搜索函数. 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' E ...
- SQL利用Case When Then多条件判断
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 WHEN 条件4 THEN 结果4 ....... ...
- sql 中 case when 语法(转)
sql语言中有没有类似C语言中的switch case的语句?? 没有,用case when 来代替就行了. 例如,下面的语句显示中文年月 select ...
- SQL中Case的使用方法(下篇)(转)
接上篇 四,根据条件有选择的UPDATE. 例,有如下更新条件 工资5000以上的职员,工资减少10% 工资在2000到4600之间的职员,工资增加15% 很容易考虑的是选择执行两次UPDATE语句, ...
随机推荐
- 关于HTML条件注释你可能不知道的一些事儿
最近经常看到类似这样的HTML代码片段,很多前端开发人员应该都熟悉: 1 <!--[if lt IE 7]> <html class="ie6"> ...
- 【C语言】12-指向一维数组元素的指针
一.用指针指向一维数组的元素 1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p ...
- vs2005中删除最近打开的项目和文件的记录
vs2005中总是保留最近打开的项目和文件的记录,甚至是以删除的它也不删,-_-!下面介绍几种删除的方法: 第一种:建立一个bat文件,以后双击即可清除,内置代码如下: @echo off@REG D ...
- gif 录制 屏幕 工具
写博客或者提出问题时,很多时候需要gif才能说明问题 window录制攻略 https://pan.baidu.com/s/1gdCX1Gf mac录制攻略 第一步:打开mac内置的播放器QuickT ...
- shenyi 语录
[讲师]沈逸(65480539) 2016-06-08 14:58:42 会centos 转redhat是分分钟的事 [讲师]沈逸(65480539) 2016-06-08 14:58:54 查看 ...
- 字符串&数组的相互转换
字符串 -> 数组 方法一: $str = "abcd" $s2 = $str.GetEnumerator() #$s2是无法使用下标的方式进行索引的,因为其不是array ...
- 【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示 ...
- 记录一个bug -- sprintf
#include<iostream> #include<stdio.h> int main () { char buf[10] = {0}; sprintf(buf," ...
- java语言中数值自动转换的优先顺序
转换原则:从低精度向高精度转换byte .short.int.long.float.double.char数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用 ...
- 使用 Vagrant 打造跨平台开发环境
Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史. 我们可以通过 Va ...