Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich redundante Daten beim Kombinieren mehrerer „array_agg()'-Aufrufe in einer einzelnen SQL-Abfrage?
Kombinieren mehrerer array_agg()-Aufrufe in einer einzelnen Abfrage
In Ihrer Abfrage stoßen Sie auf ein Problem, bei dem mehrere array_agg()-Aufrufe redundante Ergebnisse liefern Daten. Das Vorhandensein doppelter Zeilen aufgrund mehrerer Verknüpfungen führt zu unerwünschten Ergebnissen. Um dieses Problem zu lösen, können wir mehrere Ansätze untersuchen, die eine Zeilenmultiplikation von Anfang an vermeiden.
Lösung 1: Zuerst aggregieren, später verbinden
Eine effektive Methode ist die Aggregation der Daten in Unterabfragen, bevor die Verknüpfungen durchgeführt werden. Dadurch wird sichergestellt, dass jeder Mitarbeiterdatensatz eindeutig ist und eine Zeilenmultiplikation verhindert wird. Die geänderte Abfrage würde so aussehen:
SELECT e.id, 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 / JOIN LATERAL
Ein anderer Ansatz besteht darin, korrelierte Unterabfragen oder JOIN LATERAL in PostgreSQL 9.3 zu verwenden oder später. Mit dieser Technik können Sie die aggregierten Daten für jeden Mitarbeiter innerhalb der Hauptabfrage abrufen. Die geänderten Abfragen wären:
Korrelierte Unterabfragen:
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
JOIN LATERAL:
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
Fazit
Durch die Implementierung dieser Ansätze können Sie Zeilenmultiplikationen vermeiden und Erhalten Sie das gewünschte Ergebnis, nämlich eine Reihe von Adressen und eine Reihe von Arbeitstagen für jeden Mitarbeiter. Diese Lösungen stellen sicher, dass die Daten angemessen aggregiert und korrekt zusammengeführt werden, sodass keine zusätzliche Filterung oder Nachbearbeitung erforderlich ist.
Das obige ist der detaillierte Inhalt vonWie vermeide ich redundante Daten beim Kombinieren mehrerer „array_agg()'-Aufrufe in einer einzelnen SQL-Abfrage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!