我很可能不完全理解两者之间的差异。但是我想弄清楚我的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条。
答案 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'中的记录