我正在尝试改进一个(不是很多)简单的查询:
就像是:
SELECT a.*, (SELECT Count(*) FROM table_c c WHERE c.a_id = a.id) AS counter, b.* FROM table_a a LEFT JOIN table_b b ON b.a_id = a.id
可以,但是实际上,我只是在进行2个查询,因此我需要改进它,因此它只能执行一个查询(如果可能的话)。
有人知道我该怎么做到吗?
最简单的方法可能只是将相关子查询移到子查询中。
注意: 许多优化程序极其有效地处理了相关子查询。 您的示例查询可能是完全合理的。
SELECT a.*, b.*, c.row_count FROM table_a a LEFT JOIN table_b b ON b.a_id = a.id LEFT JOIN ( SELECT a_id, Count(*) row_count FROM table_c GROUP BY a_id ) c ON c.a_id = a.id
另一个注意事项: SQL是一个表达式,不能直接执行,而是使用嵌套循环,哈希联接等将其转换为计划。请勿假设拥有两个查询是一件坏事。 在这种情况下,与单查询然后使用GROUP BY和相比,我的示例可以大大减少读取次数COUNT(DISTINCT)。
GROUP BY
COUNT(DISTINCT)