Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich redundante Daten beim Kombinieren mehrerer „array_agg()'-Aufrufe in einer einzelnen SQL-Abfrage?

Wie vermeide ich redundante Daten beim Kombinieren mehrerer „array_agg()'-Aufrufe in einer einzelnen SQL-Abfrage?

Linda Hamilton
Linda HamiltonOriginal
2024-12-29 13:56:23696Durchsuche

How to Avoid Redundant Data When Combining Multiple `array_agg()` Calls in a Single SQL Query?

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!

Stellungnahme:
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