2016-09-06 118 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)在这里被视为一个集合。