Sql 子查询与多表联接

Sql 子查询与多表联接,sql,inner-join,nested-queries,Sql,Inner Join,Nested Queries,我有3张表A、B、C。我想列出交叉点计数 方式1:- select count(id) from A a join B b on a.id = b.id join C c on B.id = C.id; 结果计数-X 方式2:- SELECT count(id) FROM A WHERE id IN (SELECT id FROM B WHERE id IN (SELECT id FROM C)); 结果计数-Y 每个查询中的结果计数都不同。到底出了什么问题?AJOIN可以成倍增加行数并过

我有3张表A、B、C。我想列出交叉点计数

方式1:-

select count(id) from A a join B b on a.id = b.id join C c on  B.id = C.id;
结果计数-X

方式2:-

SELECT count(id) FROM A WHERE id IN (SELECT id FROM B WHERE id IN (SELECT id FROM C));
结果计数-Y


每个查询中的结果计数都不同。到底出了什么问题?

A
JOIN
可以成倍增加行数并过滤掉行

在这种情况下,第二个计数应该是正确的,因为没有重复计数的内容——假设
id
a
中是唯一的。如果不是,则需要
计数(不同的a.id)

使用
JOIN
的等效项将使用
COUNT(DISTINCT)

我提到这一点是为了完整性,但不推荐这种方法。仅使用
distinct
将行数相乘以删除它们是低效的

在许多数据库中,最有效的方法可能是:

select count(*)
from a
where exists (select 1 from b where b.id = a.id) and
      exists (select 1 from c where c.id = a.id);

注意:这假设
id
列上有索引,并且
id
a
中是唯一的a
JOIN
可以增加行数并过滤掉行

在这种情况下,第二个计数应该是正确的,因为没有重复计数的内容——假设
id
a
中是唯一的。如果不是,则需要
计数(不同的a.id)

使用
JOIN
的等效项将使用
COUNT(DISTINCT)

我提到这一点是为了完整性,但不推荐这种方法。仅使用
distinct
将行数相乘以删除它们是低效的

在许多数据库中,最有效的方法可能是:

select count(*)
from a
where exists (select 1 from b where b.id = a.id) and
      exists (select 1 from c where c.id = a.id);

注意:这假设
id
列上有索引,并且
id
a

中是唯一的。联接版本可能会返回重复的id,并进行多次计数。联接版本可能会返回重复的id,要进行多次计数。在10米记录上尝试了所有3种解决方案:-
连接,包括distinct
需要45秒,
exists
需要46秒,
nested Select
需要52秒。测量查询时间不会帮助您始终找到最佳解决方案。请检查每种方法的查询计划,添加联接和不同将增加最终结果的开销。@PythonEnthusiast。
是否存在
是否具有建议的索引?它是否需要
select distinct
?在10M记录上尝试了所有3种解决方案:-
连接,包括distinct
需要45秒,
exists
需要46秒,
nested select
需要52秒。测量查询时间并不能帮助您始终找到最佳解决方案。请检查每种方法的查询计划,添加联接和不同将增加最终结果的开销。@PythonEnthusiast。
是否存在
是否具有建议的索引?它是否需要
选择distinct