TAB1:
TAB2:
SELECT  TA.CODE,              
        TA.SYJID,  
        TA.INVNO,  
        decode(TA.ZY,'J',tb.MFID,'B',ta.chr2,null), 
        ROUND(TA.MONEY,2) ,  
        ROUND(TA.NUM1,2), 
        TA.RQSJ,  
        ROUND( TA.YEJF,2)       FROM  TAB1 TA, 
            TAB2 TB 
  WHERE ta.CODE=tb.CUSTNO(+) AND 
        TA.ZY IN ('B','J') AND 
        TA.RQ>=TO_DATE('20080227','YYYYMMDD')  AND 
        TA.RQ <=TO_DATE('20080227','YYYYMMDD')+1  
GROUP BY TA.CODE,              
          TA.SYJID,  
          TA.INVNO,  
          decode(TA.ZY,'J',tb.MFID,'B',ta.chr2,null), 
          ROUND(TA.MONEY,2) ,  
          ROUND(TA.NUM1,2), 
          TA.RQ,  
          ROUND( TA.YEJF,2) 
 这是我写的SQL,执行后,每条记录就会出现重复的的,应该只有7条记录,结果出现了14条记录, 我的得到的结果就是,如果表A的ZY字段是‘J’时,则取表B的MFID字段,如果是‘B’时,则取表A的CHR2字段,如果ta.chr2与tb.MFID都为空时,则有空 我取的这天的原始数据中,表A的CHR2和表B中的GZ都是为NULL ,如果表A的CHR2和表B的GZ都为NULL时,则显示是空注:1.ta.code=tb.custno
    2. tab2的每产生一条记录,都往tab1中插入一条记录,而ta.zy='J',但是插入的记录中,没有tb.MFID字段

解决方案 »

  1.   

    ta.CODE=tb.CUSTNO(+) 
    这个条件是A,B表的关联的唯一条件吗?
      

  2.   

    补充:
    当tab2表往tab1表中插入一条记录时,
    则:tab2.custno=tab1.code and tab2.syjh=tab1.syjid and tab2.fphm=tab1.invno
      

  3.   

    你贴出的数据不是你的SQL查询出的数据
    不好判断
      

  4.   

    晕,那你应该用这三个字段去连接啊
    tab2.custno=tab1.code and tab2.syjh=tab1.syjid and tab2.fphm=tab1.invno
      

  5.   

    当把三个字段都连接上去后,查出来的结果为空,因为在tab1表中,有一种情况,就是ZY=‘J’,tab1.syjid=null,invno=null的情况,是从其它的地方插入的,
      

  6.   


    你确认一下,有没有可以连接出结果的数据呀select * from TAB1 ta
    WHERE   TA.ZY IN ('B','J') AND 
            TA.RQ>=TO_DATE('20080227','YYYYMMDD')  AND 
            TA.RQ <=TO_DATE('20080227','YYYYMMDD')+1  查查这个有没有数据。
      

  7.   

    select ta.CODE ,  
            ta.syjid ,
            ta.invno, 
            nvl(ta.chr2,(select tb.mfid from RPT_SELLCUST tb where ta.code=tb.custno AND ta.syjid=tb.syjh AND ta.invno=tb.fphm and rownum <2)) chr2 ,
            ROUND(TA.MONEY,2) mon , 
            ROUND(TA.NUM1,2) num1,
            TA.RQSJ,   
            ROUND( TA.YEJF ,2) yejf  
    from CRD_CARDLOG ta
    WHERE  ta.zy IN ('J','B') AND
           ta.rqsj >= :v_rq1 AND
           ta.rqsj <  :v_rq2+1 and
            nvl(ta.code,'%') like :v_code and
                    nvl(ta.chr2,'%') like :v_chr2
    我已经找到了答复,谢谢大家