sql >> データベース >  >> RDS >> PostgreSQL

行を重複させずに、3つのテーブルを結合し、2つのテーブルからフィールドの正しい合計を計算するにはどうすればよいですか?

    ロジックを正しく理解していれば、問題は2つの結合によって引き起こされるデカルト積です。クエリを追跡するのは少し難しいですが、意図は相関するサブクエリでより適切に処理されると思います:

    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 ;
    

    こちら 対応するSQLフィドルです。

    編集:

    副選択は、group byよりも高速である必要があります 集計されていないデータ。ただし、適切なインデックスが必要です:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) およびkeyword_click(keyword_id, date, clicks)



    1. 引数2の無効なJSONテキスト-MySQL5.7.8のjson_contains

    2. サブクエリ-最高のスコアを取得する

    3. SQL Server 2008のEntityFramework(LINQを使用)でのオフセット/フェッチベースのページング(実装)

    4. 条件が満たされたときにMySQLがデータファイルをロードする