ORA-03113 SQL中select语句全表扫描带来的异常

  今天在ERP系统的维护过程中,业务人员反馈了一个问题过来,是ERP系统生产单模块的预览打印报表出错,看到后我逐步做了以下的排查:

1、尝试其他单据是否存在相同问题

2、直接打开水晶报表,将参数代入看看是否是报表问题

排查之后逐渐发现,问题出在数据源身上,找到返回数据集的存储过程,进入测试窗口检查是否运行正常,结果发现运行即进入卡死状态,进程无法中断,只好强行退出PL/SQL,这时候我估计到问题出在SQL语句上,因此将SQL语句复制到新的窗口,代入参数,如下:

SELECT WO_NBR,WO_LOT,WO_TYPE,WO_TYPE2 ,WO_PART, WO_QTY_ORD,WO_QTY_COMP,WO_QTY_RJCT,WO_LINE,WO_ORD_DATE,WO_REL_DATE,WO_DUE_DATE,WO_STATUS,WO_CLOSE_BY,WO_CLOSE_DATE,
         WO_SO_NBR,WO_SO_LINE,WO_FGOV_PER,WO_VEND,WO_SEND,WO_SOFT,WO_SOFT_VER,WO_ECA_NBR,WO_ECA_VER,WO_COUNT_OUTPUT,WO_ECN_NBR ,WO_TYPE1, WO_SKDR_NBR, WO_MAN_HAUR, WO_LIST_UPDATED,WO_SCHEDULE_DATE,
         WO_STD_PL,WO_ADD_SPARE, WO_ADD_SCREEN,WO_COMMON_ONLY,WO_RMKS,cast(WO_OTHER_RMKS as varchar2(1024)) as WO_OTHER_RMKS,WO_SITE,WO_PROG_CODE, WO_DOC_CODE,WO_CRT_BY,WO_CRT_DATE,WO_MOD_TIMES,WO_MOD_BY,WO_MOD_DATE,WO_CHAR1,WO_CHAR2,WO_CHAR3,WO_CHAR4,WO_CHAR5,       
         WO_CHAR6, WO_QTY1,WO_QTY2,WO_WF_STATUS WO_PST,WO_PST_BY,WO_PST_DATE,WO_SRC_NBR,WO_SRC_LINE,WO_SRC_LOT,WO_PT_LOT,WO_TRY_NBR,
         OEM_MSTR.*,
         
        OEMDO_LOGO_COUNT,OEMDO_MN_LOGO,OEMDO_DEF_LANG,OEMDO_S_LOGO,
           OEMDC_NBR,OEMDC_VERSION, OEMDC_NAME,OEMDC_EN_COMP,(OEMDC_EN_QTY_PER_M/OEMDC_EN_QTY_PER_D) AS OEMDC_EN_QTY_PER,OEMDC_PT_MSTR.PT_UM AS OEMDC_EN_COMP_UM,
           OEMDC_RMKS,
           
        WO_PT_MSTR.PT_DESC1 AS WO_PT_DESC1, WO_PT_MSTR.PT_DESC2 AS WO_PT_DESC2,
        WO_PT_MSTR.PT_DESC1  AS WO_PT_DESC,
        WO_PT_MSTR.PT_DRAW,WO_PT_MSTR.PT_CLASS AS WO_PT_CLASS,WO_PT_MSTR.PT_GROUP AS WO_PT_GROUP,WO_PT_MSTR.PT_MD AS PT_MD,
       
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC1, SOFT_PT_MSTR.PT_DESC2 AS SOFT_PT_DESC2,
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC,
        
        OEMDC_PT_MSTR.PT_DESC1 AS OEMDC_EN_COMP_DESC1,OEMDC_PT_MSTR.PT_DESC2 AS OEMDC_EN_COMP_DESC2,SOD_CMMT ,SO_CUST,
        SC4_MSTR.*,
        SOD_PART_QTY,
        SOD_SC_QTY,SC5_DESC,OEMDO_SFS_NBR,OEMDO_SFS_VERSION,A.GEND_NAME AS MB_DESC ,B.GEND_NAME AS INTERFACE_DESC,SOD_SFS_NBR,SOD_SFS_VERSION,
        SFS_S_LOGO,SFS_MN_LOGO,SFSD1_MN_LANG,wo_print_times,
        wo_try_nbr,try_task_no,try_content,try_aim

 FROM
        WO_MSTR JOIN PT_MSTR  WO_PT_MSTR ON WO_PART = WO_PT_MSTR.PT_PART
           LEFT JOIN OEM_MSTR ON WO_ECA_NBR = OEM_NBR AND WO_ECA_VER = OEM_VERSION
           LEFT JOIN OEMDC_DET ON OEM_NBR = OEMDC_NBR AND OEM_VERSION = OEMDC_VERSION
           LEFT JOIN OEMDO_DET ON OEM_NBR = OEMDO_NBR AND OEM_VERSION = OEMDO_VERSION
           LEFT JOIN PT_MSTR  OEMDC_PT_MSTR ON TRIM(OEMDC_EN_COMP) = TRIM(OEMDC_PT_MSTR.PT_PART)
           LEFT JOIN PT_MSTR  SOFT_PT_MSTR ON TRIM(WO_SOFT) = SOFT_PT_MSTR.PT_PART
           LEFT JOIN GEND_DET A ON OEM_MB_PROJECT = A.GEND_OPTION AND A.GEND_GEN ='SBGD_SCHEME'
           LEFT JOIN GEND_DET B ON OEM_INTER_REQ = B.GEND_OPTION AND B.GEND_GEN ='INTERFACE_REQ'
           
           LEFT JOIN SOD_DET ON SOD_NBR = WO_SO_NBR AND SOD_LINE = WO_SO_LINE
           LEFT JOIN SO_MSTR ON SO_NBR  = SOD_NBR
           LEFT JOIN  SFS_MSTR ON SFS_NBR = SOD_SFS_NBR AND SFS_VERSION = SOD_SFS_VERSION
           LEFT JOIN SFSD1_DET ON SFSD1_NBR = SFS_NBR AND SFSD1_VERSION = SFS_VERSION AND SFSD1_DEF_LANG = 1
           LEFT JOIN SC5_MSTR ON SC5_CODE  = SOD_SC5 AND SC5_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN  SC5_START AND SC5_EXPIRE   -- SC5_EXPIRE > TRUNC(SYSDATE, 'DD')
           LEFT JOIN SC4_MSTR ON SC4_CODE  = SOD_SC4_CODE AND SC4_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN SC4_START AND SC4_EXPIRE
           left join try_mstr on wo_try_nbr=try_nbr
    WHERE (WO_NBR = 'GWH17040102' ) AND
         (WO_LOT = ' ') AND
          (OEMDC_NAME  IN (SELECT GEND_OPTION
                                          FROM GEND_DET
                                          WHERE GEND_GEN ='MT_COMP'
                                               AND (GEND_PROPERTY2 ='Y' OR GEND_PROPERTY2 ='Y'))
                         OR ISEQUAL(OEMDC_NAME , '') = 1 )
View Code

执行结果如下:

接着又一次进入了卡死状态,PL/SQL客户端崩溃,只好重新登录。

之后为了减少客户端崩溃的次数,思索问题原因和问题解决方案,度娘查了有一会,可能查的方向有所偏差,没搜到能够解决问题的办法,于是只好自己通过调试来解决问题。首先,对于SQL方面的问题,我一般从两个地方入手:一个连表处,一个是列。

刚开始从连表处进行调试,第一次调试顺利的SQL如下:

SELECT count(1)

 FROM
        WO_MSTR JOIN PT_MSTR  WO_PT_MSTR ON WO_PART = WO_PT_MSTR.PT_PART
           LEFT JOIN OEM_MSTR ON WO_ECA_NBR = OEM_NBR AND WO_ECA_VER = OEM_VERSION
           LEFT JOIN OEMDC_DET ON OEM_NBR = OEMDC_NBR AND OEM_VERSION = OEMDC_VERSION
           LEFT JOIN OEMDO_DET ON OEM_NBR = OEMDO_NBR AND OEM_VERSION = OEMDO_VERSION
           LEFT JOIN PT_MSTR  OEMDC_PT_MSTR ON TRIM(OEMDC_EN_COMP) = TRIM(OEMDC_PT_MSTR.PT_PART)
           LEFT JOIN PT_MSTR  SOFT_PT_MSTR ON TRIM(WO_SOFT) = SOFT_PT_MSTR.PT_PART
           LEFT JOIN GEND_DET A ON OEM_MB_PROJECT = A.GEND_OPTION AND A.GEND_GEN ='SBGD_SCHEME'
           LEFT JOIN GEND_DET B ON OEM_INTER_REQ = B.GEND_OPTION AND B.GEND_GEN ='INTERFACE_REQ'
           
           LEFT JOIN SOD_DET ON SOD_NBR = WO_SO_NBR AND SOD_LINE = WO_SO_LINE
           LEFT JOIN SO_MSTR ON SO_NBR  = SOD_NBR
           LEFT JOIN  SFS_MSTR ON SFS_NBR = SOD_SFS_NBR AND SFS_VERSION = SOD_SFS_VERSION
           LEFT JOIN SFSD1_DET ON SFSD1_NBR = SFS_NBR AND SFSD1_VERSION = SFS_VERSION AND SFSD1_DEF_LANG = 1
           --LEFT JOIN SC5_MSTR ON SC5_CODE  = SOD_SC5 AND SC5_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN  SC5_START AND SC5_EXPIRE   -- SC5_EXPIRE > TRUNC(SYSDATE, 'DD')
           --LEFT JOIN SC4_MSTR ON SC4_CODE  = SOD_SC4_CODE AND SC4_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN SC4_START AND SC4_EXPIRE
           left join try_mstr on wo_try_nbr=try_nbr
    WHERE (WO_NBR = 'GWH17040102' ) AND
         (WO_LOT = ' ') AND
          (OEMDC_NAME  IN (SELECT GEND_OPTION
                                          FROM GEND_DET
                                          WHERE GEND_GEN ='MT_COMP'
                                               AND (GEND_PROPERTY2 ='Y' OR GEND_PROPERTY2 ='Y'))
                         OR ISEQUAL(OEMDC_NAME , '') = 1 )
View Code

虽然调试成功,但是却牺牲了业务需求,业务数据方面不满足实际,因此需要进行下一步尝试,紧接着打算从属性列方面着手,由于之前已有select后面最好带具体的列名的常识,

因此在调试中,直接将OEM_MSTR.*和SC4_MSTR.*这两个全表扫描进行注释,避免执行这两句SQL

SELECT WO_NBR,WO_LOT,WO_TYPE,WO_TYPE2 ,WO_PART, WO_QTY_ORD,WO_QTY_COMP,WO_QTY_RJCT,WO_LINE,WO_ORD_DATE,WO_REL_DATE,WO_DUE_DATE,WO_STATUS,WO_CLOSE_BY,WO_CLOSE_DATE,
         WO_SO_NBR,WO_SO_LINE,WO_FGOV_PER,WO_VEND,WO_SEND,WO_SOFT,WO_SOFT_VER,WO_ECA_NBR,WO_ECA_VER,WO_COUNT_OUTPUT,WO_ECN_NBR ,WO_TYPE1, WO_SKDR_NBR, WO_MAN_HAUR, WO_LIST_UPDATED,WO_SCHEDULE_DATE,
         WO_STD_PL,WO_ADD_SPARE, WO_ADD_SCREEN,WO_COMMON_ONLY,WO_RMKS,cast(WO_OTHER_RMKS as varchar2(1024)) as WO_OTHER_RMKS,WO_SITE,WO_PROG_CODE, WO_DOC_CODE,WO_CRT_BY,WO_CRT_DATE,WO_MOD_TIMES,WO_MOD_BY,WO_MOD_DATE,WO_CHAR1,WO_CHAR2,WO_CHAR3,WO_CHAR4,WO_CHAR5,       
         WO_CHAR6, WO_QTY1,WO_QTY2,WO_WF_STATUS WO_PST,WO_PST_BY,WO_PST_DATE,WO_SRC_NBR,WO_SRC_LINE,WO_SRC_LOT,WO_PT_LOT,WO_TRY_NBR,
         --OEM_MSTR.*,
         
        OEMDO_LOGO_COUNT,OEMDO_MN_LOGO,OEMDO_DEF_LANG,OEMDO_S_LOGO,
           OEMDC_NBR,OEMDC_VERSION, OEMDC_NAME,OEMDC_EN_COMP,(OEMDC_EN_QTY_PER_M/OEMDC_EN_QTY_PER_D) AS OEMDC_EN_QTY_PER,OEMDC_PT_MSTR.PT_UM AS OEMDC_EN_COMP_UM,
           OEMDC_RMKS,
           
        WO_PT_MSTR.PT_DESC1 AS WO_PT_DESC1, WO_PT_MSTR.PT_DESC2 AS WO_PT_DESC2,
        WO_PT_MSTR.PT_DESC1  AS WO_PT_DESC,
        WO_PT_MSTR.PT_DRAW,WO_PT_MSTR.PT_CLASS AS WO_PT_CLASS,WO_PT_MSTR.PT_GROUP AS WO_PT_GROUP,WO_PT_MSTR.PT_MD AS PT_MD,
       
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC1, SOFT_PT_MSTR.PT_DESC2 AS SOFT_PT_DESC2,
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC,
        
        OEMDC_PT_MSTR.PT_DESC1 AS OEMDC_EN_COMP_DESC1,OEMDC_PT_MSTR.PT_DESC2 AS OEMDC_EN_COMP_DESC2,SOD_CMMT ,SO_CUST,
        --SC4_MSTR.*,
        SOD_PART_QTY,
        SOD_SC_QTY,SC5_DESC,OEMDO_SFS_NBR,OEMDO_SFS_VERSION,A.GEND_NAME AS MB_DESC ,B.GEND_NAME AS INTERFACE_DESC,SOD_SFS_NBR,SOD_SFS_VERSION,
        SFS_S_LOGO,SFS_MN_LOGO,SFSD1_MN_LANG,wo_print_times,
        wo_try_nbr,try_task_no,try_content,try_aim

 FROM
        WO_MSTR JOIN PT_MSTR  WO_PT_MSTR ON WO_PART = WO_PT_MSTR.PT_PART
           LEFT JOIN OEM_MSTR ON WO_ECA_NBR = OEM_NBR AND WO_ECA_VER = OEM_VERSION
           LEFT JOIN OEMDC_DET ON OEM_NBR = OEMDC_NBR AND OEM_VERSION = OEMDC_VERSION
           LEFT JOIN OEMDO_DET ON OEM_NBR = OEMDO_NBR AND OEM_VERSION = OEMDO_VERSION
           LEFT JOIN PT_MSTR  OEMDC_PT_MSTR ON TRIM(OEMDC_EN_COMP) = TRIM(OEMDC_PT_MSTR.PT_PART)
           LEFT JOIN PT_MSTR  SOFT_PT_MSTR ON TRIM(WO_SOFT) = SOFT_PT_MSTR.PT_PART
           LEFT JOIN GEND_DET A ON OEM_MB_PROJECT = A.GEND_OPTION AND A.GEND_GEN ='SBGD_SCHEME'
           LEFT JOIN GEND_DET B ON OEM_INTER_REQ = B.GEND_OPTION AND B.GEND_GEN ='INTERFACE_REQ'
           
           LEFT JOIN SOD_DET ON SOD_NBR = WO_SO_NBR AND SOD_LINE = WO_SO_LINE
           LEFT JOIN SO_MSTR ON SO_NBR  = SOD_NBR
           LEFT JOIN  SFS_MSTR ON SFS_NBR = SOD_SFS_NBR AND SFS_VERSION = SOD_SFS_VERSION
           LEFT JOIN SFSD1_DET ON SFSD1_NBR = SFS_NBR AND SFSD1_VERSION = SFS_VERSION AND SFSD1_DEF_LANG = 1
           LEFT JOIN SC5_MSTR ON SC5_CODE  = SOD_SC5 AND SC5_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN  SC5_START AND SC5_EXPIRE   -- SC5_EXPIRE > TRUNC(SYSDATE, 'DD')
           LEFT JOIN SC4_MSTR ON SC4_CODE  = SOD_SC4_CODE AND SC4_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN SC4_START AND SC4_EXPIRE
           left join try_mstr on wo_try_nbr=try_nbr
    WHERE (WO_NBR = 'GWH17040102' ) AND
         (WO_LOT = ' ') AND
          (OEMDC_NAME  IN (SELECT GEND_OPTION
                                          FROM GEND_DET
                                          WHERE GEND_GEN ='MT_COMP'
                                               AND (GEND_PROPERTY2 ='Y' OR GEND_PROPERTY2 ='Y'))
                         OR ISEQUAL(OEMDC_NAME , '') = 1 )
View Code

结果,SQL顺利执行,并返回受影响的行集,这时候我就想有可能已经找到原因了,同时,如果真的是这个问题,那么解决方案可以将*号替换为具体需要的列,在完全不影响需求而且SQL可行的情况下解决这个问题,于是开始尝试:

SELECT WO_NBR,WO_LOT,WO_TYPE,WO_TYPE2 ,WO_PART, WO_QTY_ORD,WO_QTY_COMP,WO_QTY_RJCT,WO_LINE,WO_ORD_DATE,WO_REL_DATE,WO_DUE_DATE,WO_STATUS,WO_CLOSE_BY,WO_CLOSE_DATE,
         WO_SO_NBR,WO_SO_LINE,WO_FGOV_PER,WO_VEND,WO_SEND,WO_SOFT,WO_SOFT_VER,WO_ECA_NBR,WO_ECA_VER,WO_COUNT_OUTPUT,WO_ECN_NBR ,WO_TYPE1, WO_SKDR_NBR, WO_MAN_HAUR, WO_LIST_UPDATED,WO_SCHEDULE_DATE,
         WO_STD_PL,WO_ADD_SPARE, WO_ADD_SCREEN,WO_COMMON_ONLY,WO_RMKS,cast(WO_OTHER_RMKS as varchar2(1024)) as WO_OTHER_RMKS,WO_SITE,WO_PROG_CODE, WO_DOC_CODE,WO_CRT_BY,WO_CRT_DATE,WO_MOD_TIMES,WO_MOD_BY,WO_MOD_DATE,WO_CHAR1,WO_CHAR2,WO_CHAR3,WO_CHAR4,WO_CHAR5,       
         WO_CHAR6, WO_QTY1,WO_QTY2,WO_WF_STATUS WO_PST,WO_PST_BY,WO_PST_DATE,WO_SRC_NBR,WO_SRC_LINE,WO_SRC_LOT,WO_PT_LOT,WO_TRY_NBR,
         
         OEM_NBR, OEM_VERSION, OEM_APPLY, OEM_CUST, OEM_BRAND, OEM_STATUS, OEM_STCHG_BY, OEM_STCHG_DATE, OEM_MT, OEM_CUST_TYPE, OEM_CFG_TYPE, 
         OEM_SAME, OEM_MB_PRO, OEM_SCREEN, OEM_LEVEL, OEM_QUALITY, OEM_BC_TYPE, OEM_URGENCY, OEM_RMKS, OEM_TEMPLATE, OEM_NG, OEM_NG_BY, OEM_NG_DATE, 
         OEM_NG_REASON, OEM_MT_BY, OEM_MT_DATE, OEM_TRY, OEM_EMC, OEM_SITE, OEM_WF_STATUS, OEM_PROG_CODE, OEM_CRT_BY, OEM_CRT_DATE, OEM_MOD_TIMES, 
         OEM_MOD_BY, OEM_MOD_DATE, OEM_PST, OEM_PST_BY, OEM_PST_DATE, OEM_APRV, OEM_APRV_BY, OEM_APRV_DATE, OEM_CHAR1, OEM_CHAR2, OEM_CHAR3, 
         OEM_CHAR4, OEM_CHAR5, OEM_CHAR6, OEM_QTY1, OEM_QTY2, OEM_SRC_NBR, OEM_MTP_FLOW, OEM_DISABLED, OEM_MB_REQ, OEM_PW_REQ, OEM_MB_PROJECT, 
         OEM_INTER_REQ, OEM_COUNTRY, OEM_MAC_REQ, OEM_MATERIAL, OEM_CI_INTERFACE, OEM_DATE, OEM_DSGN_NBR, OEM_APP_MSTR, OEM_PACK_TYPE, OEM_BOTTOM_CODE, 
         OEM_SALE_METHOD,
         --OEM_MSTR.*,
         
        OEMDO_LOGO_COUNT,OEMDO_MN_LOGO,OEMDO_DEF_LANG,OEMDO_S_LOGO,
           OEMDC_NBR,OEMDC_VERSION, OEMDC_NAME,OEMDC_EN_COMP,(OEMDC_EN_QTY_PER_M/OEMDC_EN_QTY_PER_D) AS OEMDC_EN_QTY_PER,OEMDC_PT_MSTR.PT_UM AS OEMDC_EN_COMP_UM,
           OEMDC_RMKS,
           
        WO_PT_MSTR.PT_DESC1 AS WO_PT_DESC1, WO_PT_MSTR.PT_DESC2 AS WO_PT_DESC2,
        WO_PT_MSTR.PT_DESC1  AS WO_PT_DESC,
        WO_PT_MSTR.PT_DRAW,WO_PT_MSTR.PT_CLASS AS WO_PT_CLASS,WO_PT_MSTR.PT_GROUP AS WO_PT_GROUP,WO_PT_MSTR.PT_MD AS PT_MD,
       
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC1, SOFT_PT_MSTR.PT_DESC2 AS SOFT_PT_DESC2,
        SOFT_PT_MSTR.PT_DESC1 AS SOFT_PT_DESC,
        
        OEMDC_PT_MSTR.PT_DESC1 AS OEMDC_EN_COMP_DESC1,OEMDC_PT_MSTR.PT_DESC2 AS OEMDC_EN_COMP_DESC2,SOD_CMMT ,SO_CUST,
        --SC4_MSTR.*,
        SC4_CODE, SC4_DESC, SC4_CURR, SC4_START, SC4_EXPIRE, SC4_BUY, SC4_SCREEN_INCL, SC4_SC_GRT, SC4_FREE, SC4_PR_DISC, SC4_PR_DISC_QTY, 
        SC4_PR_ADJ, SC4_PR_ADJ_QTY, SC4_FR_SPARE, SC4_FR_SPARE_PCT, SC4_FR_SUIT, SC4_FR_SUIT_PCT, SC4_SPARE_PCT, SC4_PRJ, SC4_RMKS, SC4_WF_STATUS, 
        SC4_PROG_CODE, SC4_CRT_BY, SC4_CRT_DATE, SC4_MOD_TIMES, SC4_MOD_BY, SC4_MOD_DATE, SC4_PST, SC4_PST_BY, SC4_PST_DATE, SC4_CHAR1, SC4_CHAR2, 
        SC4_CHAR3, SC4_CHAR4, SC4_CHAR5, SC4_CHAR6, SC4_QTY1, SC4_QTY2, SC4_FR_SC, SC4_FR_SC_PCT, SC4_CUST, SC4_MACHINE,
        
        SOD_PART_QTY,
        SOD_SC_QTY,SC5_DESC,OEMDO_SFS_NBR,OEMDO_SFS_VERSION,A.GEND_NAME AS MB_DESC ,B.GEND_NAME AS INTERFACE_DESC,SOD_SFS_NBR,SOD_SFS_VERSION,
        SFS_S_LOGO,SFS_MN_LOGO,SFSD1_MN_LANG,wo_print_times,
        wo_try_nbr,try_task_no,try_content,try_aim

 FROM
        WO_MSTR JOIN PT_MSTR  WO_PT_MSTR ON WO_PART = WO_PT_MSTR.PT_PART
           LEFT JOIN OEM_MSTR ON WO_ECA_NBR = OEM_NBR AND WO_ECA_VER = OEM_VERSION
           LEFT JOIN OEMDC_DET ON OEM_NBR = OEMDC_NBR AND OEM_VERSION = OEMDC_VERSION
           LEFT JOIN OEMDO_DET ON OEM_NBR = OEMDO_NBR AND OEM_VERSION = OEMDO_VERSION
           LEFT JOIN PT_MSTR  OEMDC_PT_MSTR ON TRIM(OEMDC_EN_COMP) = TRIM(OEMDC_PT_MSTR.PT_PART)
           LEFT JOIN PT_MSTR  SOFT_PT_MSTR ON TRIM(WO_SOFT) = SOFT_PT_MSTR.PT_PART
           LEFT JOIN GEND_DET A ON OEM_MB_PROJECT = A.GEND_OPTION AND A.GEND_GEN ='SBGD_SCHEME'
           LEFT JOIN GEND_DET B ON OEM_INTER_REQ = B.GEND_OPTION AND B.GEND_GEN ='INTERFACE_REQ'
           
           LEFT JOIN SOD_DET ON SOD_NBR = WO_SO_NBR AND SOD_LINE = WO_SO_LINE
           LEFT JOIN SO_MSTR ON SO_NBR  = SOD_NBR
           LEFT JOIN  SFS_MSTR ON SFS_NBR = SOD_SFS_NBR AND SFS_VERSION = SOD_SFS_VERSION
           LEFT JOIN SFSD1_DET ON SFSD1_NBR = SFS_NBR AND SFSD1_VERSION = SFS_VERSION AND SFSD1_DEF_LANG = 1
           LEFT JOIN SC5_MSTR ON SC5_CODE  = SOD_SC5 AND SC5_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN  SC5_START AND SC5_EXPIRE   -- SC5_EXPIRE > TRUNC(SYSDATE, 'DD')
           LEFT JOIN SC4_MSTR ON SC4_CODE  = SOD_SC4_CODE AND SC4_CURR = SO_CURR  AND SOD_REQ_DATE BETWEEN SC4_START AND SC4_EXPIRE
           left join try_mstr on wo_try_nbr=try_nbr
    WHERE (WO_NBR = 'GWH17040102' ) AND
         (WO_LOT = ' ') AND
          (OEMDC_NAME  IN (SELECT GEND_OPTION
                                          FROM GEND_DET
                                          WHERE GEND_GEN ='MT_COMP'
                                               AND (GEND_PROPERTY2 ='Y' OR GEND_PROPERTY2 ='Y'))
                         OR ISEQUAL(OEMDC_NAME , '') = 1 )
View Code

测试结果,成功!

 

总结:

1、*在复杂的SQL中还是需要慎重使用,特别是本来不需要那么多列数据,结果带出了很多多余的数据,造成浪费,同时,后来者若不熟悉业务,不加研读该存储过程,实际上很难知道,哪些信息是真正需要的,哪些是不需要的,久而久之,会加重企业后期的维护成本;

2、在调试SQL的过程中可以通过注释来排查异常。

3、该SQL仍待优化,若哪位仁兄有更好的见解,还望指导迷津。 

posted @ 2017-04-05 15:52  *ち黑サカ  阅读(1289)  评论(0编辑  收藏  举报