SELECT A.WAREHOUSECD WAREHOUSECD,
       A.COMPANYCD COMPANYCD,
       A.SHIPDATE SHIPDATE,
       A.DOCUMENTNUMBER DOCUMENTNUMBERA,
       A.DELIVNAME DELIVNAME,
       A.SSZIPCODE SSZIPCODE,
       (SELECT T.TRANSAMT
          FROM EDIFREINVRATEMASTERRDC T
         WHERE T.BUSI = TRIM(A.COMPANYCD) AND
               T.RATEYY = TO_CHAR(A.SHIPDATE, 'YYYY') AND
               T.SSZIPCODE = TRIM(A.SSZIPCODE) AND ROWNUM = 1) TRANSAMT,
       A.NOTES NOTES,
       A.SOTYPE SOTYPE,
       DECODE(B.URGENT, 'Y', B.URGENT, 'N') URGENT,
       B.LIACODE LIABILITYCD,
       B.REACODE REASONCD,
       B.MATERIAL ITEMCD,
       B.ACTQUANTITY ACTQUANTITY,
       B.ACCQUANTITY ACCQUANTITY,
       FX_GETTOTMEASUREMENT(B.MESSAGERECEIVERIDENTIFIER,
                            B.MATERIAL,
                            B.ACTQUANTITY) CBM,
       FX_GETTOTMEASUREMENT(B.MESSAGERECEIVERIDENTIFIER,
                            B.MATERIAL,
                            B.ACCQUANTITY) ACC_CBM,
       Z.BASE_AMT BASE_AMT,
       Z.BASE_AMT /
       nvl((select count(*)
             FROM EDIPODDLYRDC W, EDIPODDLYMATLISTRDC X
            WHERE W.MESSAGENUMBER = X.MESSAGENUMBER AND W.ACTFLG = '1' AND
                  W.STS = 900 and W.RDREFERENCENUMBER = A.otherrefno1),
           1) as avg_baseamt,
       Z.ADD_AMT ADD_AMT,
       MFWAREHOUSE.SNAME mfwarehouse_sname,
       FX_GETCOMPANYNAME(A.COMPANYCD) mfcompany_sname,
       B.lot1 lot1,
       z.Documentdate Documentdate,
       Z.DOCUMENTNUMBER DOCUMENTNUMBERZ
  FROM TRSO A,
       EDIOUTDLYRDC D,
       V_EDIFRINVAMT Z,
       (SELECT W.MESSAGERECEIVERIDENTIFIER,
               W.RDREFERENCENUMBER,
               W.URGENT,
               W.LIACODE,
               W.REACODE,
               X.MATERIAL,
               X.ACTQUANTITY,
               X.ACCQUANTITY,
               X.NAME lot1
          FROM EDIPODDLYRDC W, EDIPODDLYMATLISTRDC X
         WHERE W.MESSAGENUMBER = X.MESSAGENUMBER AND W.ACTFLG = '1' AND
               W.STS = 900) B,
       MFWAREHOUSE
 WHERE A.otherrefno1 = D.DOCUMENTNUMBER AND
       A.otherrefno1 = B.RDREFERENCENUMBER AND
       A.WAREHOUSECD = MFWAREHOUSE.WAREHOUSECD AND
       A.otherrefno1 = Z.SAMSUNGREFERENCENUMBER AND Z.GUBUN = 'FR' AND
       A.ACTFLG = '1' AND A.STS = 900 AND D.ACTFLG = '1' AND D.STS = 900 AND
       A.SOTYPE IN ('NOR', 'NOF', 'SMP', 'TEI') AND
       A.WAREHOUSECD IN ('SH001', 'BJ001') AND
       (a.warehousecd = 'BJ001' AND
       a.shipdate >= to_date('2007/08/11 00:00', 'YYYY/MM/DD HH24:MI') AND
       a.shipdate <= to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI') AND
       to_date(Z.DOCUMENTDATE, 'YYYYMMDD') >=
       to_date('2007/08/11 00:00', 'YYYY/MM/DD HH24:MI') AND
       to_date(Z.DOCUMENTDATE, 'YYYYMMDD') <=
       to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI'))

解决方案 »

  1.   

    使用的子查询太多,可以进行分撤查询,还有在查询时不要对字段进行计算
    ,如:
     to_date(Z.DOCUMENTDATE, 'YYYYMMDD') <=
           to_date('2007/08/21 00:00', 'YYYY/MM/DD HH24:MI'))
    改为
     Z.DOCUMENTDATE<=timestamp'2007-08-21 00:00:00'
      

  2.   

    是很多子查询,但是这是一张报表的SQL语句,不方便进行分散查询,字段计算不能不要啊!
      

  3.   

    这个sql语句跑了多久?好像一般复杂的报表语句都跑得不快的 ...
      

  4.   

    十天的数据大约跑了3-5分钟.在PL/SQL里大约100秒,这只是10天的数据!