Si la consulta involucra grandes partes de b
y/o c
es más eficiente agregar primero y unirse después.
Espero que estas dos variantes sean considerablemente más rápidas:
SELECT a.id,
,COALESCE(b.ct, 0) + COALESCE(c.ct, 0) AS bc_ct
FROM a
LEFT JOIN (SELECT a_id, count(*) AS ct FROM b GROUP BY 1) b USING (a_id)
LEFT JOIN (SELECT a_id, count(*) AS ct FROM c GROUP BY 1) c USING (a_id);
Debe tener en cuenta la posibilidad de que algún a_id
no están presentes en absoluto en a
y/o b
. count()
nunca devuelve NULL
, pero eso es un frío consuelo frente a LEFT JOIN
, lo que te deja con NULL
valores para las filas que faltan, no obstante. Usted debe prepararse para NULL
. Utilice COALESCE()
.
O UNIR TODOS a_id
de ambas tablas, agregar, luego ÚNETE:
SELECT a.id
,COALESCE(ct.bc_ct, 0) AS bc_ct
FROM a
LEFT JOIN (
SELECT a_id, count(*) AS bc_ct
FROM (
SELECT a_id FROM b
UNION ALL
SELECT a_id FROM c
) bc
GROUP BY 1
) ct USING (a_id);
Probablemente más lento. Pero aún más rápido que las soluciones presentadas hasta ahora. Y podría prescindir de COALESCE()
y todavía no suelta ninguna fila. Es posible que obtenga ocasionalmente NULL
valores para bc_ct
, en este caso.