PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso unire 3 tabelle e calcolare la corretta somma dei campi da 2 tabelle, senza righe duplicate?

Se ho capito bene la logica, il problema è il prodotto cartesiano causato dai due join. La tua query è un po' difficile da seguire, ma penso che l'intento sia gestito meglio con sottoquery correlate:

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 ;

Qui è il corrispondente SQL Fiddle.

MODIFICA:

La sottoselezione dovrebbe essere più veloce di group by sui dati non aggregati. Tuttavia, hai bisogno degli indici giusti:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) e keyword_click(keyword_id, date, clicks) .