2016-09-06 144 views
1

我有如下的查詢重複值,與IN子句選擇查詢 - 具有IN子句

SELECT count(*) from Employee where e_id IN (121, 234, 536, 234). 

在上面的查詢,234重複兩次。

但上面的查詢返回結果與4 count = 3代替

我的問題是數據的方式重複被過濾,選擇查詢時,我沒有用過DISTINCT

如何做數據庫對待IN子句,是那種List(重複值)或Set(唯一值),或者兩者都不是的。

+0

如果你想知道對性能的影響,在這裏看看http://stackoverflow.com/questions/10944339/mysql-in-clause -performace-in-case-of-list-have-duplicate-elements-and-not-sorte –

回答

2

WHERE子句只對行進行過濾。它不會乘以它們。

所以,如果一行匹配一個條件或所有條件無關緊要。該行只是被過濾或不被過濾。

如果你想重複,然後用JOIN

select count(*) 
from employee e join 
    (select 121 as e_id union all 
     select 234 union all 
     select 536 union all 
     select 234 
    ) matches 
    using (e_id); 
+0

我進一步更新了我的q,數據庫如何處理IN子句,它是List(重複值)還是Set(獨特值)或兩者都不。 –

+0

@ ankur-singhal它有什麼不同?任何一行都不是結果。如果它匹配兩次,那就是結果。 – Barmar

+0

@ ankur-singhal將其視爲一組。另請參閱我的答案。 – redneb

2

e_id IN (121, 234, 536, 234)作爲謂詞工作:對於Employee的每一行,檢查e_id的值是否與列表中的任何值匹配。所以(121, 234, 536, 234)在這裏被視爲一個集合。