PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để tôi có thể nối 3 bảng và tính tổng các trường chính xác từ 2 bảng mà không có hàng trùng lặp?

Nếu tôi hiểu logic một cách chính xác, vấn đề là tích Descartes do hai phép nối gây ra. Truy vấn của bạn hơi khó theo dõi, nhưng tôi nghĩ mục đích được xử lý tốt hơn với các truy vấn con tương quan:

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 ;

Tại đây là SQL Fiddle tương ứng.

CHỈNH SỬA:

Lựa chọn con phải nhanh hơn nhóm group by trên dữ liệu chưa được tổng hợp. Tuy nhiên, bạn cần các chỉ mục phù hợp:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost)keyword_click(keyword_id, date, clicks) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi trường Enum bằng Alembic

  2. Yêu cầu cung cấp giấy tờ cho PGDay.IT 2011 đã được gia hạn

  3. ClassCastException:Không thể truyền số nguyên thành Long, trong khi cố gắng lặp lại qua các ID thực thể

  4. Sử dụng python sqlalchemy để thực hiện các truy vấn thô với câu lệnh WITH

  5. SQL - thứ tự của các điều kiện OR có quan trọng không?