sql >> Databasteknik >  >> RDS >> PostgreSQL

Räkna rader efter att ha sammanfogat tre tabeller i PostgreSQL

För att förenkla din logik, samla först, gå med senare.

Om du gissar saknade detaljer, skulle den här frågan ge dig det exakta antalet, hur många gånger varje användare refererades till i table1 och table2 respektive för alla användare :

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

Undvik särskilt att flera 1-n-relationer multiplicerar varandra när de sammanfogas:

För att hämta en en eller ett fåtal användare endast, LATERAL anslutningar blir snabbare (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;

Förklara upplevd skillnad

Den särskilda missmatchningen du rapporterar beror på detaljerna i en FULL OUTER JOIN :

Så du får NULL-värden tillagda på respektive andra sida för saknade matchningar. count() räknar inte NULL-värden. Så du kan få ett annat resultat beroende på om du filtrerar på u1.id=100 eller u2.id=100 .

Detta är bara för att förklara, du behöver ingen FULL JOIN här. Använd de presenterade alternativen istället.




  1. Från XML till lista över sökvägar i Oracle PL/SQL-miljö

  2. En översikt över de olika skanningsmetoderna i PostgreSQL

  3. Hur man kompilerar Qt 5.8 statiskt med PostgreSQL-plugin i VS2015

  4. Hur man reparerar en skadad Access-databas