sql >> Databasteknik >  >> RDS >> PostgreSQL

SQL-duplicerade rader med flera vänsterkopplingar

Du upplever ett samlat fanout i ovanstående fråga.

Detta händer eftersom det finns

  • antingen en 1-1- eller 1-N-koppling mellan aaa &bbb
  • det finns en 1-N-koppling mellan bbb &ccc

Den senare kopplingen skapar M dubbletter för rader som finns i bbb om de är anslutna till M rader via kopplingen till ccc

För att åtgärda felet, dela upp frågan i två CTE:er och anslut resultatet.

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)

I allmänhet, för att undvika fan-outs, tillämpa endast aggregerade operationer på kolumnerna från relationen längst till höger i en serie av joins. Om du upptäcker att du aggregerar kolumner från de mellersta tabellerna, dela upp frågan som jag har gjort ovan. Endast följande funktioner är invarianta över en fläkt out:COUNT DISTINCT , MIN , MAX




  1. PHP infogar flera kryssrutor OCH textboxarrayer i MySQL Database

  2. Visar bilder från MySQL-databas i JSF-datatabell

  3. Hur undviker man att lagra referenser för att ansluta till Oracle med JDBC?

  4. uppdatera och komprimera SQLite-databas i Android