2017-09-25 57 views
1

我有下面的表和SQL查询写入,这个查询不应该返回任何结果,但它返回ID = 1,SQL查询有什么问题?任何人都可以帮忙吗?MS SQL查询跨行多个搜索条件

**注意balance数据类型是decimal其余均为varchar

ID code balance level 
1 C 150.00 
1 P 40027.42 F 
1 P 40027.42 F 
select distinct ID from table 
(
(code = 'P' and balance = 40027.42 and level = 'F') or 
(code = 'C' and balance = 151.00) 
) 
group by ID 
having count(ID) >=2 
+0

根据您'的having'条款'count(ID)> = 2',这个查询返回符合'where'子句并且有多于1行,'ID = 1'的行的'id'。由于您有两行'ID = 1',符合'(code ='P'和balance = 40027.42和level ='F')的条款,所以' 此外,此查询不需要'distinct'。 – SqlZim

+0

having子句是好的,但问题是关于代码C的平衡值,表有150.00,我的查询有151.00,所以查询不应该返回任何结果,但它仍然忽略151.00 – AHS

+0

我明白了,但你忽略了这样的事实:你有两行满足这个条件:'(code ='P'and balance = 40027.42 and level ='F')'既然你有两行满足条件,它就会通过'having count(ID) > = 2'。 _大于或等于2_ – SqlZim

回答

1

如果你不想重复计算同code两次,你可以使用count(distinct code)

select ID 
from t 
where (code = 'P' and balance = 40027.42 and level = 'F') 
    or (code = 'C' and balance = 151.00) 
group by ID 
having count(distinct code) >=2 

如果你想只算一组不同的价值观的一次,你可以使用派生表/子查询select distinct行:

select ID 
from (
    select distinct id, code, balance, level 
    from t 
) as s 
where (code = 'P' and balance = 40027.42 and level = 'F') 
    or (code = 'C' and balance = 151.00) 
group by ID 
having count(ID) >=2 

两个rextester演示:http://rextester.com/LBKO57534

+0

真棒!!!,它工作,谢谢。 – AHS

+0

@AHS乐意帮忙! – SqlZim