2016-08-01 15 views
0

Ich bin überrascht von den Ergebnissen einer Abfrage und hoffe, dass jemand es erklären kann.LINKS Outer join + where Klausel unerwartete Ergebnisse

Die Abfrage ist eine Art groß, so dass ich destilliert zum Schlüssel Teil:

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) 

ich anderen Zeitpunkten als 6/23/16 immer bin, obwohl ich es in meiner where-Klausel. Ich denke, es hat damit zu tun, Spalten in meiner where-Klausel aus einer Left-Joined-Tabelle und einer inneren Join-Tabelle in einem Ausdruck zu kombinieren, dies aber noch nie zuvor erlebt zu haben.

UPDATE: Hinzufügen eigentliche Abfrage

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

Ihre a.dt Zustand bewegen, um innere Verknüpfung und sehen – techspider

+4

Sie über die Abfrage vereinfacht haben. Ihre 'WHERE'-Klausel kann kein anderes als das angegebene Datum zurückgeben. –

+0

@techspider zustimmen, ich vermute, es gibt eine 1 zu viele auf B oder C und das verursacht das Problem –

Antwort

1

AND vor OR ausgewertet. Es ist, als würden Sie 2 + 5 + 7 * 5 auswerten und sich fragen, warum Sie 42 und nicht 70 bekommen.

Versuchen:

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

Ja- ich dachte, dass die letzten Paren die erste nach "WHERE" passten, aber es nicht. – user1612851