SELECT A.QD_ID,A.SNAME,SUM(NVL(B.AMOUNT,0)) AMOUNT FROM QD_TABLE A LEFT JOIN QD_OUT_TABLE B ON (A.QD_ID=B.QD_ID AND to_char(B.SDATE,'yyyy-mm-dd')>='2010-12-26' AND to_char(B.SDATE,'yyyy-mm-dd')<'2012-12-26') LEFT JOIN CL_TABLE C ON B.CL_ID=C.CL_ID and c.jdfl_id=0GROUP BY A.QD_ID,A.SNAME ORDER BY A.QD_IDQD_TABLE 是区队表,QD_OUT_TABLE 是区队出库表,CL_TABLE 是材料表,jdfl_id 是材料中的材料分类字段
我想不管QD_OUT_TABLE 记录中有没有数据,所有的区队都是要显示的,不过现在的情况是加上了条件,根本不起作用
,和没加一样,种类改变,查询出的结果也没有变化

解决方案 »

  1.   

    不用left join,用 (+) 看看。
      

  2.   

    LEFT JOIN CL_TABLE C ON B.CL_ID=C.CL_ID and c.jdfl_id=0  ->LEFT JOIN CL_TABLE C ON B.CL_ID=C.CL_ID 
    where c.jdfl_id=0
      

  3.   


    --你的条件加在C表上,而求的结果是 A.QD_ID,A.SNAME,SUM(NVL(B.AMOUNT,0))
    --并C表是左连接上去的,你在C表上增加任何条件都不会影响A表和B表数据的展现,自然结果就不会有什么变化了
    --不知道你是不是想表达这个意思。SELECT A.QD_ID, A.SNAME, SUM(NVL(B.AMOUNT, 0)) AMOUNT
      FROM QD_TABLE A
      LEFT JOIN QD_OUT_TABLE B ON (A.QD_ID = B.QD_ID AND
                                  TO_CHAR(B.SDATE, 'yyyy-mm-dd') >=
                                  '2010-12-26' AND
                                  TO_CHAR(B.SDATE, 'yyyy-mm-dd') <
                                  '2012-12-26')
      LEFT JOIN CL_TABLE C ON B.CL_ID = C.CL_ID
     WHERE C.JDFL_ID = 0
     GROUP BY A.QD_ID, A.SNAME
     ORDER BY A.QD_ID
    ;
      

  4.   


    --可以换种写法试试,我觉得这样看的比较条理
    SELECT A.QD_ID,A.SNAME,SUM(NVL(D.AMOUNT,0)) AMOUNT
    FROM QD_TABLE A ,(SELECT B.QD_ID,B.AMOUNT 
                                FROM QD_OUT_TABLE B,CL_TABLE C 
                                WHERE B.CL_ID=C.CL_ID AND TO_CHAR(B.SDATE,'YYYY-MM-DD')>='2010-12-26' 
                                   AND TO_CHAR(B.SDATE,'YYYY-MM-DD')<'2012-12-26')  AND C.JDFL_ID=0
                                ) D
    WHERE A.QD_ID=D.QD_ID(+)
    GROUP BY A.QD_ID,A.SNAME
    ORDER BY A.QD_ID