Om uw logica te vereenvoudigen, aggregeert u eerst en voegt u later toe.
Als u vermoedt dat er details ontbreken, zou deze zoekopdracht u het exacte aantal geven, hoe vaak naar elke gebruiker werd verwezen in table1
en table2
respectievelijk voor alle gebruikers :
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);
Vermijd in het bijzonder dat meerdere 1-n-relaties elkaar vermenigvuldigen wanneer ze worden samengevoegd:
Om een enkele of enkele gebruikers op te halen alleen, LATERAL
joins zullen sneller zijn (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;
Leg waargenomen verschil uit
De specifieke mismatch die u meldt, is te wijten aan de specifieke kenmerken van een FULL OUTER JOIN
:
U krijgt dus NULL-waarden toegevoegd aan de respectieve andere kant voor ontbrekende overeenkomsten. count()
telt geen NULL-waarden. U kunt dus een ander resultaat krijgen, afhankelijk van of u filtert op u1.id=100
of u2.id=100
.
Dit is alleen om uit te leggen, je hebt geen FULL JOIN
nodig hier. Gebruik in plaats daarvan de gepresenteerde alternatieven.