2016-08-01 14 views
0

私はクエリの結果に驚いて、誰かがそれを説明できると願っています。LEFT外部結合+ where句の予期しない結果

問合せは、一種の大きいので、私は重要な部分にそれを蒸留:

SELECT * 
FROM A 
INNER JOIN B ON A.id = B.id 
LEFT JOIN C ON C.ID = B.ID 
WHERE A.Dt = '2016-06-23' 
    AND (B.StatusCode=' ' OR C.Code <> 9) 

私は私が私のwhere句でそれを持っているにもかかわらず6/23/16以外の日付を取得しています。私はそれは、左の結合されたテーブルと内部の結合されたテーブルの1つの式から、私のwhere節の列を結合することと関係していると思うが、以前はこれを経験したことがない。

UPDATE:

SELECT * 
FROM CERT2.cube_mbbal_Daily_Balances BAL 
INNER JOIN CERT.Dim_Account A ON A.AccountKey = BAL.AccountKey 
LEFT JOIN CERT2.Dim_LoanAccount LA ON A.AccountKey = LA.AccountKey 
WHERE 
    (A.AccountClassification IN ('Checking', 'Savings') 
    AND AccountStatus IN ('1', '3', '5', '6', '7')) 
    OR 
    (A.AccountClassification IN ('Time') 
    AND AccountStatus IN ('1', '5', '7')) 
    OR 
    (A.AccountClassification IN ('Loan') 
    AND (AccountStatus <> 'C' OR RiskCode <> 9)) 
    AND BAL.DateOfFinancialMeasure = 20160623 
+0

が参加し、簡略化されたクエリの上にあなたが持っている – techspider

+4

を参照してください。 WHERE句は、指定された日付以外の日付を返すことはできません。 –

+0

@techspiderに同意すると、BまたはCのいずれかに1対多数が存在し、それが問題の原因であると思われます –

答えて

1

AND実際のクエリを追加するにはOR前に評価されます。 2 + 5 + 7 * 5と評価されている理由は、42で、70ではない理由が不思議です。

試してみてください。

select * 
from CERT2.cube_mbbal_Daily_Balances BAL 
inner join CERT.Dim_Account A 
    on A.AccountKey = BAL.AccountKey 
left join CERT2.Dim_LoanAccount LA 
    on A.AccountKey = LA.AccountKey 
where (
      (A.AccountClassification in ('Checking', 'Savings') and AccountStatus in ('1', '3', '5', '6', '7')) 
     or (A.AccountClassification in ('Time') and AccountStatus in ('1', '5', '7')) 
     or (A.AccountClassification in ('Loan') and (AccountStatus <> 'C' or RiskCode <> 9)) 
    ) 
    and BAL.DateOfFinancialMeasure = 20160623 
は、内側にあなたのa.dt条件を移動
+0

はい - 私は最後のparenが "WHERE"の後の最初のparenとマッチしたと思ったが、そうでなかった。 – user1612851