Vermeiden Sie mehrere Array-Aggregate in einer Abfrage
In Ihrer Abfrage versuchen Sie, mehrere array_agg()-Funktionen in einer einzigen Abfrage zu verwenden um Arrays aus verschiedenen Tabellen abzurufen. Dieser Ansatz führt jedoch zu doppelten Zeilen und verzerrten Ergebnissen.
Das Problem
Wenn Sie mehrere Verknüpfungen und Aggregatfunktionen ausführen, kann die Ergebnismenge mit Duplikaten überfüllt sein. In Ihrem Fall werden durch die Verknüpfung der Adress- und Arbeitstagstabellen mehrere Zeilen für jeden Mitarbeiter erstellt, was zu doppelten Einträgen in den aggregierten Arrays führt.
Lösung: Separate Aggregation und Verknüpfungen
Um dieses Problem zu beheben, wird empfohlen, den Aggregationsvorgang vom Join-Prozess zu trennen. Betrachten Sie die folgenden Ansätze:
Zuerst aggregieren, später verbinden:
Zunächst aggregieren Sie die Daten aus jeder Tabelle separat mithilfe von Unterabfragen. Verbinden Sie dann die aggregierten Ergebnisse basierend auf dem Primärschlüssel oder einer gemeinsamen Spalte:
SELECT e.id, e.name, e.age, e.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 ) e JOIN workingdays wd ON wd.employeeid = e.id GROUP BY e.id, e.name, e.age;
Korrelierte Unterabfragen oder JOIN LATERAL:
Berücksichtigen Sie die selektive Filterung von Daten Verwendung korrelierter Unterabfragen oder LATERAL-Joins in PostgreSQL:
Korreliert 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';
JOIN LATERAL (PostgreSQL 9.3 oder höher):
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';
Diese Ansätze stellen sicher, dass die aggregierten Arrays korrekt mit dem verknüpft sind entsprechende Mitarbeiter, die die erwarteten Ergebnisse liefern.
Das obige ist der detaillierte Inhalt vonWie vermeide ich doppelte Zeilen bei der Verwendung mehrerer Array-Aggregate in einer SQL-Abfrage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!