Heim > Datenbank > MySQL-Tutorial > Wie vermeide ich Zeilenmultiplikation bei der Verwendung mehrerer „array_agg()'-Aufrufe in SQL-Joins?

Wie vermeide ich Zeilenmultiplikation bei der Verwendung mehrerer „array_agg()'-Aufrufe in SQL-Joins?

Patricia Arquette
Freigeben: 2024-12-31 14:26:14
Original
145 Leute haben es durchsucht

How to Avoid Row Multiplication When Using Multiple `array_agg()` Calls in SQL Joins?

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;
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage