sql >> Database >  >> RDS >> PostgreSQL

Dubbele SQL-rijen met meerdere left joins

Je ervaart totale fan-out in de bovenstaande zoekopdracht.

Dit gebeurt omdat er

  • een 1-1 of 1-N join tussen aaa &bbb
  • er is een 1-N-join tussen bbb &ccc

De laatste join creëert M duplicaten voor rijen die bestaan ​​in bbb als ze worden samengevoegd met M-rijen via de join to ccc

Om de fout op te lossen, splitst u de zoekopdracht op in twee CTE's en voegt u het resultaat samen.

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)

Om fan-outs te voorkomen, past u in het algemeen alleen geaggregeerde bewerkingen toe op de kolommen van de meest rechtse relatie in een reeks joins. Als je merkt dat je kolommen uit de middelste tabellen aggregeert, splits dan de query op zoals ik hierboven heb gedaan. Alleen de volgende functies zijn invariant over een fan out:COUNT DISTINCT , MIN , MAX




  1. MySQL-viewdefiner-machtigingen en fout 1356

  2. mssql converteer varchar naar float

  3. hoe databases in phpmyadmin te herstellen na het verwijderen van xampp

  4. selecteren voor update met JDBC?