2014-09-30 79 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)