假设我有下表架构和数据
create table categories(
id integer primary key,
parent_id integer
);
insert into categories
values
(1,0),
(2,0),
(3,1),
(4,1);
我需要计算每个条目的孩子数,即结果应该是
id | parent_id | count
----+-----------+-------
1 | 0 | 2
2 | 0 | 0
3 | 1 | 0
4 | 1 | 0
以下查询产生正确的结果,但我担心性能。我猜它循环遍历表的次数与其中的行数一样多。
select *, (select count(*) from categories b where a.id=b.parent_id) from categories a
有可能优化吗?
嵌套选择可以更慢或更快取决于正在处理的记录数。
如果只有几条记录或使用 where 子句将其过滤掉,这可能会更快或具有相同的速度
所有记录的更快解决方案将是这样的
使用此查询计划器可以更轻松地确定要做什么。嵌套选择计划者更难处理,因为它必须将它们视为 VOLATILE。这意味着它必须继续为每条记录调用嵌套查询