2017-09-25 59 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