1

我以为我用下面的两个查询得到了相同的结果,但是当我尝试时得到了不同的结果,谁能解释一下除了加入和子查询之外有什么区别。这里 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 行。任何人都可以解释发生了什么。

提前致谢

4

3 回答 3

4

第一个查询从第一个表中选择id在第二个表中有一个的所有行。

第二个查询从第一个表中选择所有行,并且对于这些行中的每一行,选择第二个表中的所有行。然后过滤掉id不匹配的行。

如果id在第二个表中不是唯一的,则第二个查询可以返回比第一个更多的行。

于 2013-05-01T06:51:17.640 回答
1

他们都试图做同样的事情:从 tbl_1 中获取所有行,如果 tbl_2 中,其 id 值可以在 t2id 列中找到,但如果在 tbl_2 中多次找到 id,第二个行将多次从 tbl_1 返回同一行(不是特别有用)。

但是这两个查询都比不上这个,它也做了理智的事情,只是效率更高:

select distinct t1.*
from tbl_1 t1
join tbl_2 t2 on t1.t1id = t2.t2id;
于 2013-05-01T07:07:18.117 回答
1

'in' 和 'join' 查询不匹配的原因是:-

tbl1 id 名称 1 abc

tbl2 id 名称 1 abc 1 abc

现在,select * from tbl1 where id in (select id from tbl2) 虽然表 2 中存在 2 个 id 值,即 1,但从 tbl1 中只提取了一行。您可以尝试将上述查询执行为 select * from tbl1 where id in (1,1) --> 它只会给出 1 行这是因为“如果指定的值与子查询或列表中的任何值匹配,则 In 返回 true”

第二,innerjoin 查询将产生 2 行,因为 tbl1 中的 id 与 tbl2 表中的 2 行匹配。

于 2013-05-01T08:24:40.397 回答