sql >> Databáze >  >> RDS >> PostgreSQL

Spočítejte řádky po spojení tří tabulek v PostgreSQL

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.




  1. Využití výčtu MyBatis

  2. Server pgAdmin 4 nelze kontaktovat:Závažná chyba

  3. $db =new PDO(mysql:host=$host;db_name=$db_name, $user, $pass);

  4. Mám použít funkci JOIN nebo spustit několik dotazů ve struktuře smyčky?