在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引;
把in替换为exists

解决方案 »

  1.   

    你的表设计的有问题吧。根据表的一个标志对不同的列进行sum,呵呵。
      

  2.   

    这是个聚组的查询,不要用WHERE,应用HAVING
      

  3.   

    having和where的不同仅在于一个在聚组之后筛选记录,一个在聚组之前筛选记录
      

  4.   

    如果这段sql是经常用的话,不妨建立一个view,只要对view select即可.
      

  5.   

    please refine the design of tables and recreate your index.
    if it is not possible ,just recreate the statement as below:
    (if there is any syntax error or obvoius logical mistake,please
    correct for me. i am just telling no more than my solution)------------
    SELECT   A.GJLDATE GJLDATE,
             A.GJLGDID GJLGDID,
             GOODSBASE.GBCNAME,
             GOODSBASE.GBBARCODE,
             GOODSPRICE.GPHSJJ,
             GOODSPRICE.GPSJ,
    SUM(A.HB) AS  JHSL,
    -1*SUM(A.HB) AS  XSSL,
    SUM(B.GJLQMSL) KCSL
    FROM
    (SELECT   A.GJLDATE GJLDATE,
             A.GJLGDID GJLGDID,
             DECODE(A.GJLTRAN,'1',A.GJLSL,'2',A.GJLSL,'3',A.GJLSL,'4',A.GJLSL,'5',A.GJLSL,'6',A.GJLSL,0) as hb
             FROM    GOODSJXCLIST A
             where A.GJLMFID = '2020099'   AND 
             ( A.GJLDATE >= TO_DATE('2002-10-01','YYYY-MM-DD')   AND  A.GJLDATE <= TO_DATE('2002-10-13','YYYY-MM-DD')) 
    ) A,
    (SELECT GJLGDID,GJLDATE,GJLQMSL FROM GOODSJXCLIST WHERE GJLSEQ=(SELECT MAX(GJLSEQ) FROM GOODSJXCLIST GROUP BY GJLDATE,GJLGDID) ) B,
    GOODSPRICE,GOODSBASE
    WHERE   A.GJLGDID=GOODSPRICE.GPGDID AND
             A.GJLGDID=B.GJLGDID AND 
             A.GJLDATE=B.GJLDATE AND
             A.GJLGDID=GOODSBASE.GBID
    GROUP BY A.GJLDATE,
              A.GJLGDID,
              GOODSBASE.GBCNAME,
              GOODSBASE.GBBARCODE,
              GOODSPRICE.GPHSJJ,
              GOODSPRICE.GPSJ
     ORDER BY A.GJLDATE