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

Contar filas después de unir tres tablas en PostgreSQL

Para simplificar su lógica, agregue primero, únase después.

Adivinando detalles faltantes, esta consulta le daría el recuento exacto, cuántas veces se hizo referencia a cada usuario en table1 y table2 respectivamente para todos los usuarios :

SELECT *
FROM   users u
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t1_ct
   FROM   table1
   GROUP  BY 1
   ) t1 USING (id)
LEFT   JOIN (
   SELECT updated_by_id AS id, count(*) AS t2_ct
   FROM   table2
   GROUP  BY 1
   ) t2 USING (id);

En particular, evite múltiples relaciones 1-n que se multipliquen entre sí cuando se unen:

Para recuperar un uno o varios usuarios solo, LATERAL las uniones serán más rápidas (Postgres 9.3+):

SELECT *
FROM   users u
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t1_ct
   FROM   table1
   WHERE  updated_by_id = u.id
   ) ON true
LEFT   JOIN  LATERAL (
   SELECT count(*) AS t2_ct
   FROM   table2
   WHERE  updated_by_id = u.id
   ) ON true
WHERE  u.id = 100;

Explicar la diferencia percibida

La discrepancia particular que informa se debe a los detalles de un FULL OUTER JOIN :

Por lo tanto, obtiene valores NULL agregados en el otro lado respectivo para las coincidencias faltantes. count() no cuenta valores NULL. Entonces puede obtener un resultado diferente dependiendo de si filtra en u1.id=100 o u2.id=100 .

Esto es solo para explicar, no necesita un FULL JOIN aquí. Utilice las alternativas presentadas en su lugar.