在SQL中的连接查询中感到困惑

时间:2014-09-11 14:25:21

标签: sql oracle

以下作品:

  SELECT IBAD.TRM_CODE, IBAD.IPABD_CUR_QTY, BM.BOQ_ITEM_NO, 
         IBAD.BCI_CODE, BCI.BOQ_CODE
    FROM IPA_BOQ_ABSTRCT_DTL IBAD, 
         BOQ_CONFIG_INF BCI,BOQ_MST BM
   WHERE BM.BOQ_CODE = BCI.BOQ_CODE 
     AND BCI.BCI_CODE = IBAD.BCI_CODE
     AND BCI.STATUS = 'Y' 
     AND BM.STATUS = 'Y'  
order by boq_item_no;

结果:

enter image description here

但是在使用该查询连接多个表之后,结果令人困惑:

 SELECT  (SELECT CMN_NAME 
            FROM CMN_MST 
           WHERE CMN_CODE= BRI.CMN_RLTY_MTRL) MTRL,
         RRI.RRI_RLTY_RATE AS RATE,
         I.BOQ_ITEM_NO,
         (TRIM(TO_CHAR(IBAD.IPABD_CUR_QTY,
             '9999999999999999999999999999990.999'))) AS IPABD_CUR_QTY,
         TRIM(TO_CHAR(BRI.BRI_WT_FACTOR,
             '9999999999999999999999999999990.999'))  AS WT,
         TRIM(TO_CHAR((IBAD.IPABD_CUR_QTY*BRI.BRI_WT_FACTOR),
             '9999999999999999999999990.999')) AS RLTY_QTY,
         (TRIM(TO_CHAR((IBAD.IPABD_CUR_QTY*BRI.BRI_WT_FACTOR*RRI.RRI_RLTY_RATE),
             '9999999999999999999999990.99'))) AS TOT_AMT,
         I.TRM_CODE AS TRM
  FROM
      (SELECT * FROM ipa_boq_abstrct_dtl) IBAD
INNER JOIN 
      (SELECT * FROM BOQ_RLTY_INF) BRI
          ON IBAD.BCI_CODE = BRI.BCI_CODE 
INNER JOIN
      (SELECT * FROM RLTY_RATE_INF) RRI
          ON BRI.CMN_RLTY_MTRL = RRI.CMN_RLTY_MTRL 
INNER JOIN
      ( SELECT IBAD.TRM_CODE, IBAD.IPABD_CUR_QTY, 
               BM.BOQ_ITEM_NO, IBAD.BCI_CODE, BCI.BOQ_CODE
          FROM IPA_BOQ_ABSTRCT_DTL IBAD, 
               BOQ_CONFIG_INF BCI,BOQ_MST BM
         WHERE 
               BM.BOQ_CODE = BCI.BOQ_CODE 
           AND BCI.BCI_CODE = IBAD.BCI_CODE
           and BCI.status = 'Y' 
          and bm.status = 'Y') I
          ON BRI.BCI_CODE = I.BCI_CODE 
         AND I.TRM_CODE = BRI.TRM_CODE
         AND BRI.TRM_CODE =4
group by BRI.CMN_RLTY_MTRL, RRI.RRI_RLTY_RATE, I.BOQ_ITEM_NO, 
         IBAD.IPABD_CUR_QTY, BRI.BRI_WT_FACTOR, I.TRM_CODE, I.bci_code
order by BRI.CMN_RLTY_MTRL

结果:

enter image description here

TRM应该是11而不是第一行中的4

2 个答案:

答案 0 :(得分:1)

你得到4因为你使用

AND BRI.TRM_CODE =4

如果删除此条件,则可以获得真实结果

答案 1 :(得分:1)

在您的第一个查询中,您突出显示的两行都有BCI_CODE = 1866.

在第二个查询中,您将使用许多其他查询(来自相同的表,这看起来很奇怪)加入该结果集。特别是,您使用BCI_CODE从子查询加入另一个表,然后从(SELECT * FROM ipa_boq_abstrct_dtl) IBAD加入。由于子查询中的两个行都具有相同的BCI_CODE,因此它们将连接到其他表中的相同行。

您在第二个查询中实际显示的数量来自(SELECT * FROM ipa_boq_abstrct_dtl) IBAD,而不是来自其他子查询。

问题只是您选择I.IPABD_CUR_QTY而不是IBAD.IPABD_CUR_QTY吗?

如果您没有在查询中的多个点重复使用相同的别名,您可能会发现这一点更清楚。