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