2016-08-01 129 views
0

我對查詢的結果感到驚訝,希望有人能解釋它。左外連接+ 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) 

我得到比16年6月23日等日期,即使我有它在我的where子句。我認爲它與左連接表中的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

到內部連接移動你的病情a.dt看到 – techspider

+4

你有超過簡化了查詢。您的'WHERE'子句不能返回除指定的其他日期之外的任何其他日期。 –

+0

@techspider同意,我懷疑是B或C上有1對多,這是造成問題 –

回答

1

ANDOR之前評估。這就像你正在評估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 
+0

是的 - 我認爲最後一個paren與「WHERE」之後的第一個paren匹配,但它沒有。 – user1612851