2014-09-30 67 views
0

我有一個查詢爲什麼查詢獲取不屬於where子句的記錄?

select account, collateral,rest_flag_11 ,member_rest_flag11,member_rest_flag12 
    from FileDaily 
    left join member 
    on member.member_account=FileDaily.account 
    where member.member_rest_flag11= 80 or member.member_rest_flag12=80 
    and FileDaily.REST_FLAG_11=0 and FileDaily.COLLATERAL in (10,11,13,20) 

它越來越記錄,其中抵押= 30,40 其不在抵押品的部分(10,11,13,20), 爲什麼會變成這樣?

我試圖GE裏邊反帳號其中filedaily表抵押品=(10,11,13,20) 和rest_flag_11 = 0和在構件的member_account是member_rest_flag_11 = 80和member_rest_flag12 = 80。

我使用SQL Server 2012

+0

因爲您正在使用'OR'而沒有考慮正確的邏輯 – Lamak 2014-09-30 16:04:45

+0

您正在混合使用'和'和'或'子句。它們具有不同的綁定優先級,並且您的查詢運行方式與您所期望的不同。 – 2014-09-30 16:05:02

回答

2

的問題大概是括號,你可以通過這樣解決:

where (member.member_rest_flag11= 80 or member.member_rest_flag12=80) and 
    FileDaily.REST_FLAG_11=0 and FileDaily.COLLATERAL in (10,11,13,20) 

您可以使用此改寫in

where 80 in (member.member_rest_flag11, member.member_rest_flag12) and 
     FileDaily.REST_FLAG_11 = 0 and 
     FileDaily.COLLATERAL in (10, 11, 13, 20) 

我還建議你使用表的縮寫表的別名。他們使查詢更容易編寫和閱讀。

1

你錯過括號

select account, collateral,rest_flag_11 ,member_rest_flag11,member_rest_flag12 
    from FileDaily 
left join member 
on member.member_account=FileDaily.account 
where (member.member_rest_flag11= 80 or member.member_rest_flag12=80) 
and FileDaily.REST_FLAG_11=0 and FileDaily.COLLATERAL in (10,11,13,20)