sql >> Database >  >> RDS >> PostgreSQL

Tel rijen na het samenvoegen van drie tabellen in PostgreSQL

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.




  1. Integer vs char voor DB-recordeigenschap

  2. Waarom kan ik geen specifieke sortering gebruiken in MySQL?

  3. Hoe kan ik een mysql-verbindingspool maken met behulp van de asadmin-tool op de GlassFish-server?

  4. DISTINCT gebruiken in SQL