巧用case when做SQL优化

      下面是一张报表的SQL实现,不用深入业务,你可以看到上面的4条SQL和下面的4条SQL其实大致相同,只是部分条件不一样,想要优化的第一感觉是如何减少扫描的次数,这个时候case when就派上用场了。

SELECT DECODE(ALL_COUNT, 0, 0, ROUND(ARRIVED_COUNT / ALL_COUNT, 4) * 100) ARRIVED_RATE
  FROM (SELECT E.COUNT_RESULT + F.COUNT_RESULT + G.COUNT_RESULT +
               H.COUNT_RESULT ARRIVED_COUNT
          FROM (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PPE.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PPWP.PATROL_FLAG = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) E,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_TASK_PATROL_OBJECT       PTPO
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PTPO.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PPWP.PATROL_FLAG = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PTPO.DEVICE_ID = 1003551930) F,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PTPO.PATROL_TYPE = 1
                   AND PSD.PATROL_TYPE = -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTPO.ARRIVE_TYPE = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) G,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PTPO.PATROL_TYPE = 1
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTPO.ARRIVE_TYPE = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) H) ARRIVED_DEVICE,
       (SELECT A.COUNT_RESULT + B.COUNT_RESULT + C.COUNT_RESULT +
               D.COUNT_RESULT ALL_COUNT
          FROM (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PPE.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.PATROL_TYPE = -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) A,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_TASK_PATROL_OBJECT       PTPO
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PTPO.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PTPO.DEVICE_ID = 1003551930) B,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PSD.PATROL_TYPE = -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTPO.PATROL_TYPE = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 10035519304) C,
               (SELECT COUNT(1) COUNT_RESULT
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PTPO.PATROL_TYPE = 1
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) D) ALL_DEVICE


使用case when改造后的SQL如下,不用运行就知道效果明显。

SELECT DECODE(ALL_COUNT, 0, 0, ROUND(ARRIVED_COUNT / ALL_COUNT, 4) * 100) ARRIVED_RATE
  FROM (SELECT (E.COUNT_RESULT1 + F.COUNT_RESULT1 + G.COUNT_RESULT1 +
               H.COUNT_RESULT1) ARRIVED_COUNT,
               (E.COUNT_RESULT2 + F.COUNT_RESULT2 + G.COUNT_RESULT2 +
               H.COUNT_RESULT2) ALL_COUNT
          FROM (SELECT COUNT(case
                               when (PSD.PATROL_TYPE <> -1 AND PPWP.PATROL_FLAG = 1) then
                                1
                               else
                                null
                             end) COUNT_RESULT1,
                       COUNT(case
                               when PSD.PATROL_TYPE = -1 then
                                1
                               else
                                null
                             end) COUNT_RESULT2
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PPE.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) E,
               (SELECT COUNT(case
                               when PPWP.PATROL_FLAG = 1 then
                                1
                               else
                                null
                             end) COUNT_RESULT1,
                       COUNT(1) COUNT_RESULT2
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_PATROL_WORK_POINT        PPWP,
                       GG_PATROL_POINT             PPP,
                       GG_TASK_PATROL_OBJECT       PTPO
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND TO_CHAR(PTWS.WORK_SHEET_ID) = PPWP.WORK_ID
                   AND PPWP.PATROL_POINT_ID = PPP.PATROL_POINT_ID
                   AND PPP.PATROL_POINT_ID = PTPO.PATROL_POINT_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 2
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PPWP.PATROL_FLAG = 1
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PTPO.DEVICE_ID = 1003551930) F,
               (SELECT COUNT(case
                               when PTPO.ARRIVE_TYPE = 1 then
                                1
                               else
                                null
                             end) COUNT_RESULT1,
                       COUNT(case
                               when PSD.PATROL_TYPE = -1 then
                                1
                               else
                                null
                             end) COUNT_RESULT2
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PTPO.PATROL_TYPE = 1
                   AND PSD.PATROL_TYPE = -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) G,
               (SELECT COUNT(case
                               when PTPO.ARRIVE_TYPE = 1 then
                                1
                               else
                                null
                             end) COUNT_RESULT1,
                       COUNT(1) COUNT_RESULT2
                  FROM GG_TASK_WORK_SHEET          PTWS,
                       GG_TASK_PATROL_SHEET_DETAIL PSD,
                       GG_TASK_PATROL_OBJECT       PTPO,
                       GG_PATROL_EQUIPMENT         PPE
                 WHERE PTWS.WORK_SHEET_ID = PSD.WORK_SHEET_ID
                   AND PTWS.WORK_SHEET_ID = PTPO.WORK_SHEET_ID
                   AND PTPO.PATROL_LINE_ID = PPE.PATROL_LINE_ID
                   AND PTPO.FUNCTION_LOCATION_ID = PPE.FUNCTION_LOCATION_ID
                   AND PTWS.TASK_TYPE = 4
                   AND PTWS.SHEET_TYPE = 1
                   AND PTPO.PATROL_TYPE = 1
                   AND PSD.PATROL_TYPE <> -1
                   AND PSD.IS_NEED_PDA = '1'
                   AND PTWS.IS_COMPLETE = '3'
                   AND TO_CHAR(PTWS.REAL_END_DATE, 'YYYY') = '2013'
                   AND PPE.DEVICE_ID = 1003551930) H) ARRIVED_DEVICE



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值