sql >> Base de Datos >  >> RDS >> PostgreSQL

Obtener el recuento de claves externas de varias tablas

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.