一尘不染

SQL将第二个表中的行计数添加到主查询

sql

我正在尝试改进一个(不是很多)简单的查询:

  • 我需要从表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个查询,因此我需要改进它,因此它只能执行一个查询(如果可能的话)。

有人知道我该怎么做到吗?


阅读 136

收藏
2021-03-08

共1个答案

一尘不染

最简单的方法可能只是将相关子查询移到子查询中。

注意: 许多优化程序极其有效地处理了相关子查询。 您的示例查询可能是完全合理的。

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)

2021-03-08