PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Conta le righe dopo aver unito tre tabelle in PostgreSQL

Per semplificare la tua logica, aggrega prima, poi unisciti.

Indovinando i dettagli mancanti, questa query ti darebbe il conteggio esatto, quante volte ogni utente è stato referenziato in table1 e table2 rispettivamente per tutti gli utenti :

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);

In particolare, evita che più relazioni 1-n si moltiplichino quando unite insieme:

Per recuperare un uno o pochi utenti solo, LATERAL i join saranno più veloci (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;

Spiega la differenza percepita

La particolare mancata corrispondenza segnalata è dovuta alle specifiche di un FULL OUTER JOIN :

Quindi ottieni valori NULL aggiunti sul rispettivo altro lato per le corrispondenze mancanti. count() non conta i valori NULL. Quindi puoi ottenere un risultato diverso a seconda che filtri su u1.id=100 o u2.id=100 .

Questo è solo per spiegare, non è necessario un FULL JOIN qui. Usa invece le alternative presentate.