Изпитвате обобщено отклонение в горната заявка.
Това се случва, защото има
- съединяване 1-1 или 1-N между
aaa
&bbb
- има 1-N съединение между
bbb
&ccc
Последното присъединяване създава M
дубликати за редове, които съществуват в bbb
ако са присъединени към M редове чрез съединение към ccc
За да коригирате грешката, разделете заявката на две CTE и обединете резултата.
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)
Като цяло, за да избегнете разклонения, прилагайте агрегатни операции само към колоните от най-дясната релация в поредица от съединения. Ако установите, че събирате колони от средните таблици, разделете заявката, както направих по-горе. Само следните функции са инвариантни в разклонение:COUNT DISTINCT
, MIN
, MAX