我认为下面显示的两个 SQL 语句在功能上是相同的,但显然我错了,因为它们返回不同的结果。
谁能解释一下?
select count(*)
from t
where t.id in (select distinct v_id from v)
select count(*)
from t
join v on t.id = v.v_id
答案 0 :(得分:2)
JOIN
可以通过两种方式更改查询中的行数:
IN
过滤掉不匹配的值。但是,如果 v
有重复项,它不会生成重复项。如果结果不同,则表明 v
与 v_id
有重复项。
答案 1 :(得分:0)
让我们试着用简单的话来解释。 如果 t.id 在表 v
中,第一个查询将从 t 返回 count(*)但是第二个查询将首先连接带有 id 和 v_id 的两个表。然后它会从他们的连接表中返回计数。
例如,如果 t 的 id 为 1、2 和 1,而 v 的 id 为 1 和 2
select count(*) from t where t.id in (select distinct v_id from v)
and
select count(*) from t join v on t.id = v.v_id
两个查询都将返回与 count: 3 相同的结果
select count(*) from v where t.v_id in (select distinct id from t)
and
select count(*) from t join v on t.id = v.v_id
将返回不同的结果。第一个查询将返回 2,但第二个查询将返回 3。
如果表中有重复值,Join 可以增加行数。