PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich 3 Tabellen verbinden und die korrekte Summe der Felder aus 2 Tabellen berechnen, ohne doppelte Zeilen?

Wenn ich die Logik richtig verstehe, ist das Problem das kartesische Produkt, das durch die beiden Joins verursacht wird. Ihre Abfrage ist etwas schwer zu verfolgen, aber ich denke, die Absicht wird besser mit korrelierten Unterabfragen behandelt:

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 ;

Hier ist die entsprechende SQL-Fiddle.

BEARBEITEN:

Die Unterauswahl sollte schneller sein als group by auf den nicht aggregierten Daten. Sie benötigen jedoch die richtigen Indizes:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) und keyword_click(keyword_id, date, clicks) .