query 1:SELECT B.CASE_NO, B.EMPLID, B.NAME 
FROM STW_BTRIP_DETAIL B
WHERE B.TRANSACTIONAL_STATUS ='A'
AND  B.PRINT_FLAG IS NULL query 2:
SELECT  B.CASE_NO, B.EMPLID, B.NAME, CORP.corp_gst, CASH.cash_gst 
FROM STW_BTRIP_DETAIL B,
(SELECT ca.case_no, sum(cg.gst) as corp_gst FROM STW_CORP_CARD_DETAILS ca ,STW_CORP_CARD_GST_DETAILS cg WHERE ca.EMPLID  =  cg.EMPLID(+) AND ca.ACCT_NUM  =  cg.ACCT_NUM(+) AND ca.POST_DT  =  cg.POST_DT(+) AND ca.TRAN_SEQ_NUM  =  cg.TRAN_SEQ_NUM(+) GROUP BY ca.case_no) CORP,
(SELECT case_no ,sum(gst) as cash_gst FROM stw_btrip_official_cash GROUP BY case_no) CASH 
WHERE B.TRANSACTIONAL_STATUS ='A' 
AND B.PRINT_FLAG IS NULL 
AND B.case_no = CORP.case_no(+) 
AND B.case_no = CASH.case_no(+) 
执行的结果是2的返回集比1小,照我的想法,因为是left outer join,不管corp和cash这两个临时表里有没有数据,2的查询结果都应该和1相同.请问是哪种情况下,2的返回集合比1小呢? 我想返回和1相同大小的集合,该怎么办? 谢谢.

解决方案 »

  1.   


    我个人也认为2的结果条数应该要大于等于1的结果条数。
    (如果有理论证明这个观点是错误的,那么下面的也没必要分析)我觉得你尝试自己分析一下,问题的关键是要找出2比1少了哪些数据。SELECT oa.case_no, ob.case_no
      FROM (SELECT b.case_no, b.emplid, b.NAME
              FROM stw_btrip_detail b
             WHERE b.transactional_status = 'A' AND b.print_flag IS NULL) oa,
           (SELECT b.case_no, b.emplid, b.NAME, corp.corp_gst, cash.cash_gst
              FROM stw_btrip_detail b,
                   (SELECT   ca.case_no, SUM (cg.gst) AS corp_gst
                        FROM stw_corp_card_details ca,
                             stw_corp_card_gst_details cg
                       WHERE ca.emplid = cg.emplid(+)
                         AND ca.acct_num = cg.acct_num(+)
                         AND ca.post_dt = cg.post_dt(+)
                         AND ca.tran_seq_num = cg.tran_seq_num(+)
                    GROUP BY ca.case_no) corp,
                   (SELECT   case_no, SUM (gst) AS cash_gst
                        FROM stw_btrip_official_cash
                    GROUP BY case_no) cash
             WHERE b.transactional_status = 'A'
               AND b.print_flag IS NULL
               AND b.case_no = corp.case_no(+)
               AND b.case_no = cash.case_no(+)) ob
     WHERE oa.case_no = ob.case_no(+) AND ob.case_no IS NULL然后再在2中分析少这些数据的原因。
    在进行分析前,可以先确认下以下几个问题:1)1和2是在同一个session中执行的吗?如果不是,是否1中有未提交的数据?2)各表中的case_no是否存在NULL值?
      

  2.   

    corp和cash的case_no 列值有不等于STW_BTRIP_DETAIL B 表的case_no 列值
    所以会少
      

  3.   

    left outer join是没问题的,应该是数据的问题。检查一下几个表的数据,留意一下null的,手工测试一下。
      

  4.   

    经确认结果集是相同的,可能是前端的report过滤掉一些结果.给分,谢谢.