Auflösen mehrerer array_agg()-Aufrufe in einer einzelnen Abfrage
Bei der Arbeit mit mehreren Joins mit Arrays ist es wichtig, deren Auswirkungen zu verstehen die Ergebnisse. In diesem Fall versucht die ursprüngliche Abfrage, Arrays für Adressen und Arbeitstage für jeden Mitarbeiter zu extrahieren. Die unerwartete Vervielfachung von Zeilen aufgrund mehrerer Verknüpfungen führt jedoch zu einer falschen Aggregation.
Lösung 1: Zuerst aggregieren, später verbinden
Um dieses Problem zu lösen, ist ein effektiver Ansatz um die Daten in Unterabfragen zu aggregieren, bevor sie zusammengefügt werden. Durch die Trennung der Aggregation von den Joins wird das Problem der Zeilenmultiplikation vermieden:
SELECT e.name, e.age, ad.streets, array_agg(wd.day) AS days FROM ( SELECT e.id, e.name, e.age, array_agg(ad.street) AS streets FROM employees e JOIN address ad ON ad.employeeid = e.id GROUP BY e.id -- PK covers whole row ) e JOIN workingdays wd ON wd.employeeid = e.id GROUP BY e.id, e.name, e.age;
Lösung 2: Korrelierte Unterabfragen oder JOIN LATERAL
Zur selektiven Filterung nach Mitarbeitern , korrelierte Unterabfragen können verwendet werden:
SELECT name, age , (SELECT array_agg(street) FROM address WHERE employeeid = e.id) AS streets , (SELECT array_agg(day) FROM workingdays WHERE employeeid = e.id) AS days FROM employees e WHERE e.namer = 'peter'; -- very selective
Alternativ können LATERAL-Joins verwendet werden in Postgres 9.3 oder höher eingesetzt werden:
SELECT e.name, e.age, a.streets, w.days FROM employees e LEFT JOIN LATERAL ( SELECT array_agg(street) AS streets FROM address WHERE employeeid = e.id GROUP BY 1 ) a ON true LEFT JOIN LATERAL ( SELECT array_agg(day) AS days FROM workingdays WHERE employeeid = e.id GROUP BY 1 ) w ON true WHERE e.name = 'peter'; -- very selective
Diese alternativen Ansätze stellen sicher, dass alle qualifizierten Mitarbeiter im Ergebnis erhalten bleiben, wodurch das vorherige Problem der Zeilenmultiplikation vermieden wird.
Das obige ist der detaillierte Inhalt vonWie vermeide ich Zeilenmultiplikation bei der Verwendung mehrerer „array_agg()'-Aufrufe in SQL-Joins?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!