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

SQL trùng lặp các hàng với nhiều phép nối bên trái

Bạn đang gặp sự cố tổng hợp trong truy vấn trên.

Điều này xảy ra bởi vì có

  • kết hợp 1-1 hoặc 1-N giữa aaa &bbb
  • có liên kết 1-N giữa bbb &ccc

Phép nối sau tạo ra M bản sao cho các hàng tồn tại trong bbb nếu chúng được nối với M hàng thông qua nối với ccc

Để sửa lỗi, hãy chia truy vấn thành hai CTE và nối kết quả.

WITH agg_bb AS (
SELECT aa.id, sum(bb.count)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
GROUP BY aa.id
)
, agg_cc AS (SELECT aa.id, count(DISTINCT cc.id)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
LEFT JOIN cccc cc ON cc.bb_id = bb.id
GROUP BY aa.id
)
SELECT * FROM agg_bb JOIN agg_cc USING (id)

Nói chung, để tránh bị hâm mộ, chỉ áp dụng các phép toán tổng hợp cho các cột từ quan hệ ngoài cùng bên phải trong một loạt các phép nối. Nếu bạn thấy mình đang tổng hợp các cột từ các bảng giữa, hãy chia nhỏ truy vấn như tôi đã làm ở trên. Chỉ các chức năng sau đây là bất biến trên quạt ra:COUNT DISTINCT , MIN , MAX




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql-sắp xếp mảng theo từ trong mỗi phần tử

  2. Lỗi cú pháp tại hoặc gần END với tên cột END

  3. Thêm giây vào dấu thời gian

  4. Có vấn đề gì khi cài đặt psycopg2 trong virtualenv trên MacOS catalina có cài đặt PostgreSQL 12.1 không?

  5. Cách hoạt động của hàm Degrees () trong PostgreSQL