Chcete-li zjednodušit svou logiku, nejprve agregujte, připojte se později.
Pokud odhadnete chybějící podrobnosti, tento dotaz vám poskytne přesný počet, kolikrát byl každý uživatel odkazován v table1
a table2
respektive pro všechny uživatele :
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);
Zejména se vyhněte tomu, aby se vícenásobné vztahy 1-n vzájemně násobily, když jsou spojeny:
Chcete-li načíst jednoho nebo několik uživatelů pouze, LATERAL
připojení budou rychlejší (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;
Vysvětlete vnímaný rozdíl
Konkrétní neshoda, kterou nahlásíte, je způsobena specifiky FULL OUTER JOIN
:
Takže pro chybějící shody získáte hodnoty NULL připojené na příslušné druhé straně. count()
nepočítá hodnoty NULL. Můžete tedy získat jiný výsledek podle toho, zda filtrujete podle u1.id=100
nebo u2.id=100
.
To jen pro vysvětlení, nepotřebujete FULL JOIN
tady. Místo toho použijte uvedené alternativy.