我正在尝试改进一个(不是那么多)简单的查询:
- 我需要检索表 A 中的每一行。
- 然后将表 A 与表 B 连接起来,这样我就可以获得所需的所有数据。
- 同时,我需要添加一个额外的列,其中包含表 C 中的 count()。
就像是:
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 个查询,我需要改进它,以便它只执行一个(如果可能的话)。
谁知道我怎样才能实现这一目标?
最简单的方法可能只是将相关子查询移至子查询中。
NOTE: 许多优化器非常有效地处理相关子查询。您的示例查询可能是完全合理的。
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
and COUNT(DISTINCT)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)