Sql 子查询与多表联接
我有3张表A、B、C。我想列出交叉点计数 方式1:-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可以成倍增加行数并过
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
中是唯一的aJOIN
可以增加行数并过滤掉行
在这种情况下,第二个计数应该是正确的,因为没有重复计数的内容——假设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
?