INNER JOIN和IN子句不返回相同的计数?

时间:2014-07-15 20:30:22

标签: mysql sql

我很可能不完全理解两者之间的差异。但是我想弄清楚我的optout表中有多少人实际上在我的客户端表中。我尝试了两种不同的方式,并认为它们会返回相同的数量......

方法一:

Select count(*) from `optout`
    where fname in (Select fname from client)
    and lname in (Select lname from client)
    and state in (Select state from client);

方法二:

Select count(*) from `optout` as t1
    join `client` as t2
        on t1.fname = t2.fname
           t1.lname = t2.lname
           t1.state = t2.state;

哪种方式可以正确处理?方法一返回5,000+条记录,方法二返回258条。

4 个答案:

答案 0 :(得分:3)

方法二是你想要的,因为它计算optout中与fname,lname和state中client中的单行匹配的行。

方法一返回output中具有client中存在的fname,lname和state行的行,即使它们分布在client表中的多个不同行中。

答案 1 :(得分:0)

方法一只要求client表中存在每个值,而不是每个值都存在于client表的同一行中。

方法二确保每一行都具有您所追求的匹配值。

答案 2 :(得分:0)

第二个相当于

Select count(*) from `optout`
where (fname, lname, state) in (select fname, lname, state from client);

至少,这种语法应该适用于Oracle。

答案 3 :(得分:0)

AS对Jacek L.的回答 他们是等同的并不是真的。 即使fname,lname和state的组合在表Clients中多次出现,IN也会有所区别并且只计数一次。在这种情况下,Join将乘以'output'中的记录