我认为我通过以下两个查询获得了相同的结果但是当我尝试时我得到了不同的结果,任何人都可以解释除了加入和子查询之外的区别。 这里t1id是主列,t2id是从tbl_1引用的列
select * from tbl_1 where t1id in (select t2id from tbl_2);
select t1.* from tbl_1 t1, tbl_2 t2 where t1.t1id = t2.t2id;
编辑:当我尝试第一次查询时有93条记录,第二次查询时有74条记录,我稍微更改了第一个查询:
select * from tbl_1 where t1id in (select distinct t2id from tbl_2);
然后我有40行。任何人都可以解释发生了什么。
提前致谢
答案 0 :(得分:4)
第一个查询选择第一个表中第二个表中有id
的所有行。
第二个查询从第一个表中选择所有行,对于每个行,选择第二个表中的所有行。然后,它会过滤掉id
不匹配的行。
如果id
在第二个表中不唯一,则第二个查询可以返回比第一个更多的行。
答案 1 :(得分:1)
他们都试图做同样的事情:获取tbl_1中的所有行,如果tbl_2,则可以在t2id列中找到其id值,尽管如果找到id,第二行将从tbl_1多次返回同一行在tbl_2中的时间(不是特别有用)。
但是这两个查询都不如这个查询,这也很有效,只是非常有效:
select distinct t1.*
from tbl_1 t1
join tbl_2 t2 on t1.t1id = t2.t2id;
答案 2 :(得分:1)
'in'和'join'查询不匹配的原因是: -
TBL1 id名称 1 abc
TBL2 id名称 1 abc 1 abc
现在,从tbl1中选择*,其中id为(从tbl2中选择id) 尽管表2中存在2个id值,即1,但是从tbl1只取出一行。 你可以尝试执行上面的查询 select * from tbl1 where id in(1,1) - >它只会提供1行 这是因为“如果指定的值与子查询或列表中的任何值匹配,则返回true”
2,内部连接查询将产生2行,因为来自tbl1的id与来自tbl2表的2行匹配。