PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je joindre 3 tables et calculer la somme correcte des champs de 2 tables, sans lignes en double ?

Si je comprends bien la logique, le problème est le produit cartésien causé par les deux jointures. Votre requête est un peu difficile à suivre, mais je pense que l'intention est mieux gérée avec des sous-requêtes corrélées :

select k.*,
       (select sum(cost)
        from ad_group_keyword_network n
        where n.event_date >= '2015-12-27' and
              n.ad_group_keyword_id = 1210802 and
              k.id = n.ad_group_keyword_id
       ) as cost,
       (select sum(clicks)
        from keyword_click c
        where (c.date is null or c.date >= '2015-12-27') and
              k.keyword_id = c.keyword_id               
       ) as clicks
from ad_group_keyword k
where k.status = 2 ;

Ici est le SQL Fiddle correspondant.

MODIFIER :

La sous-sélection doit être plus rapide que le group by sur les données non agrégées. Cependant, vous avez besoin des bons index :ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) et keyword_click(keyword_id, date, clicks) .