2013-05-01 73 views
1

我以为我用以下两个查询获得相同的结果,但当我尝试时得到了不同的结果,有谁可以请解释除了联接和子查询之外有什么区别。 从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; 

编辑在这里t1id被主列和T2ID被引用的列:当我想我有93条记录为第一个查询和74第二个查询,我略微改变了第一查询关键词,比如:

select * from tbl_1 where t1id in (select distinct t2id from tbl_2); 

然后我得到了40行。任何人都可以解释发生了什么。

预先感谢

+0

当您比较两个时,'EXPLAIN'会说些什么?第二个查询是'JOIN'的一种形式,其中第一个是直接子查询。 – tadman 2013-05-01 06:43:35

回答

4

第一个查询选择来自第一表具有在所述第二表中的id所有行。

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

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

+0

但相反,我有第一个查询93记录和第二个查询74记录,我不明白登录为什么这么..! – Chella 2013-05-01 07:42:33

+0

请现在看看我编辑的问题,然后回答请 – Chella 2013-05-01 07:45:17

+0

Ho man ..!在第二个ID不应该是唯一的我认为(因为它是外键,它不是我的情况下的一对一关系) – Chella 2013-05-01 07:47:30

1

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

但是这两个查询不如这一个,这也确实理智的事情,只是MUCHO有效地重复:

select distinct t1.* 
from tbl_1 t1 
join tbl_2 t2 on t1.t1id = t2.t2id; 
+0

@a_horse_with_no_name是的。现在怎么样? – Bohemian 2013-05-01 07:32:21

+0

请看看我编辑的问题,我已经告诉我,我认为它达到了相同,但我得到了不同的结果。U再次传达了相同的结果 – Chella 2013-05-01 07:45:51

+0

为什么你认为独特的操作是有效的?根据我的经验,它们非常昂贵。 – Andomar 2013-05-01 07:53:29

1

原因“中”和“参加”查询之间的错配是: -

TBL1 ID名称 1 ABC

tbl2的 ID名称 1 ABC 1 ABC

now,select * from tbl1 where id in(select from tb12) 尽管表2中存在2个id值,即1,但只有一行是从tbl1中取出的。 你可以尝试执行上述查询作为 select * from tbl1 where id in(1,1) - >它将只给出1行 这是因为“In返回true,如果指定的值匹配子查询中的任何值或一个列表“

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

相关问题