zoukankan      html  css  js  c++  java
  • 子查询有OR无法展开,改写成union

    SELECT A.*
      FROM (SELECT CD.*,
                   nvl(CV.SUM_CI_BALANCE, 0) as SUM_CI_BALANCE,
                   nvl(CV.SUM_LN_BALANCE, 0) as SUM_LN_BALANCE
              FROM OCRM_F_CI_CUST_DESC CD
              left join (select cust_id,
                               FR_ID,
                               sum(CI_BALANCE) as sum_CI_BALANCE,
                               sum(LN_BALANCE) as sum_LN_BALANCE
                          from OCRM_F_CI_CUST_VIEW
                         where 1 = 1
                           and FR_ID = '15601'
                           and (MGR_ID = '01092' OR
                               MGR_ID IN
                               (SELECT USER_ID
                                   FROM ADMIN_AUTH_MANAGE_ACCOUNT
                                  WHERE MANAGE_ID = '01092'))
                         group by cust_id, FR_ID) CV
                on CD.Cust_Id = CV.cust_id
               and CD.Fr_Id = CV.fr_id
             WHERE 1 = 1
               and CD.FR_ID = '15601') A
     where 1 = 1
       AND ((EXISTS
            (SELECT 1
                FROM OCRM_F_CI_BELONG_CUSTMGR MGR
               WHERE MGR.CUST_ID = A.CUST_ID
                 AND (MGR.MGR_ID = '01092' OR
                     MGR.MGR_ID IN (SELECT USER_ID
                                       FROM ADMIN_AUTH_MANAGE_ACCOUNT
                                      WHERE MANAGE_ID = '01092')))))
     ORDER BY to_number(SUM_CI_BALANCE) DESC, to_number(SUM_LN_BALANCE) DESC;
    
    
    
    
    Plan hash value: 4232450453
     
    ---------------------------------------------------------------------------------------------------------------------------
    | Id  | Operation                        | Name                           | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                 |                                | 48729 |    11M|       | 10916   (1)| 00:02:11 |
    |   1 |  SORT ORDER BY                   |                                | 48729 |    11M|    12M| 10916   (1)| 00:02:11 |
    |*  2 |   HASH JOIN RIGHT OUTER          |                                | 48729 |    11M|       |  8242   (1)| 00:01:39 |
    |   3 |    VIEW                          |                                |  4483 |   227K|       |  2148   (1)| 00:00:26 |
    |   4 |     HASH GROUP BY                |                                |  4483 |   170K|  4944K|  2148   (1)| 00:00:26 |
    |*  5 |      FILTER                      |                                |       |       |       |            |          |
    |   6 |       TABLE ACCESS BY INDEX ROWID| OCRM_F_CI_CUST_VIEW            | 89357 |  3403K|       |  1428   (1)| 00:00:18 |
    |*  7 |        INDEX RANGE SCAN          | IDX_OCRM_F_CI_CUST_VIEW2       | 89357 |       |       |   215   (1)| 00:00:03 |
    |*  8 |       INDEX RANGE SCAN           | ADMIN_AUTH_MANAGE_ACCOUNT_IDX2 |     1 |    36 |       |     1   (0)| 00:00:01 |
    |*  9 |    HASH JOIN RIGHT SEMI          |                                | 48729 |  9612K|       |  6094   (1)| 00:01:14 |
    |  10 |     VIEW                         | VW_SQ_1                        | 48655 |   950K|       |  1380   (1)| 00:00:17 |
    |* 11 |      FILTER                      |                                |       |       |       |            |          |
    |  12 |       INDEX FAST FULL SCAN       | IDX_CI_BELONG_CUSTMGR          |   969K|    24M|       |  1380   (1)| 00:00:17 |
    |* 13 |       INDEX RANGE SCAN           | ADMIN_AUTH_MANAGE_ACCOUNT_IDX2 |     1 |    36 |       |     1   (0)| 00:00:01 |
    |* 14 |     TABLE ACCESS FULL            | OCRM_F_CI_CUST_DESC            | 60233 |    10M|       |  4714   (1)| 00:00:57 |
    ---------------------------------------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("CD"."FR_ID"="CV"."FR_ID"(+) AND "CD"."CUST_ID"="CV"."CUST_ID"(+))
       5 - filter("MGR_ID"='01092' OR  EXISTS (SELECT 0 FROM "ADMIN_AUTH_MANAGE_ACCOUNT" "ADMIN_AUTH_MANAGE_ACCOUNT" 
                  WHERE "MANAGE_ID"='01092' AND "USER_ID"=:B1))
       7 - access("FR_ID"='15601')
       8 - access("USER_ID"=:B1 AND "MANAGE_ID"='01092')
       9 - access("ITEM_1"="CD"."CUST_ID")
      11 - filter("MGR"."MGR_ID"='01092' OR  EXISTS (SELECT 0 FROM "ADMIN_AUTH_MANAGE_ACCOUNT" 
                  "ADMIN_AUTH_MANAGE_ACCOUNT" WHERE "MANAGE_ID"='01092' AND "USER_ID"=:B1))
      13 - access("USER_ID"=:B1 AND "MANAGE_ID"='01092')
      14 - filter("CD"."FR_ID"='15601')
    
    
    由于子查询里有OR,导致子查询无法展开,改写后:
    SELECT A.*
      FROM (SELECT CD.*,
                   nvl(CV.SUM_CI_BALANCE, 0) as SUM_CI_BALANCE,
                   nvl(CV.SUM_LN_BALANCE, 0) as SUM_LN_BALANCE
              FROM OCRM_F_CI_CUST_DESC CD
              left join (
                       select cust_id,
                               FR_ID,
                               sum(CI_BALANCE) as sum_CI_BALANCE,
                               sum(LN_BALANCE) as sum_LN_BALANCE
                          from OCRM_F_CI_CUST_VIEW
                         where 1 = 1
                           and FR_ID = '15601'
                           and MGR_ID = '01092'
                                group by cust_id, FR_ID
                           union 
                       
                           select cust_id,
                               FR_ID,
                               sum(CI_BALANCE) as sum_CI_BALANCE,
                               sum(LN_BALANCE) as sum_LN_BALANCE
                          from OCRM_F_CI_CUST_VIEW
                         where 1 = 1
                           and FR_ID = '15601'
                           and MGR_ID IN
                               (SELECT USER_ID
                                   FROM ADMIN_AUTH_MANAGE_ACCOUNT
                                  WHERE MANAGE_ID = '01092')
                                   group by cust_id, FR_ID) CV
                on CD.Cust_Id = CV.cust_id
               and CD.Fr_Id = CV.fr_id
             WHERE 1 = 1
               and CD.FR_ID = '15601') A
     where 1 = 1
       AND ((EXISTS
          (SELECT 1
                FROM OCRM_F_CI_BELONG_CUSTMGR MGR
               WHERE MGR.CUST_ID = A.CUST_ID
                 AND MGR.MGR_ID = '01092'
                 union
                 (SELECT 1
                FROM OCRM_F_CI_BELONG_CUSTMGR MGR
               WHERE MGR.CUST_ID = A.CUST_ID
                 and MGR.MGR_ID IN (SELECT USER_ID
                                       FROM ADMIN_AUTH_MANAGE_ACCOUNT
                                      WHERE MANAGE_ID = '01092')))
                                      ))
     ORDER BY to_number(SUM_CI_BALANCE) DESC, to_number(SUM_LN_BALANCE) DESC;
    
  • 相关阅读:
    使用tcmalloc编译启动时宕机
    使用tcmalloc编译出现undefined reference to `sem_init'
    使用AddressSanitizer做内存分析(一)——入门篇
    VIM-美化你的标签栏
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
    Entity Framework Code First (一)Conventions
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/3797850.html
Copyright © 2011-2022 走看看