Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine einzelne Spalte in einer mehrspaltigen SQL-Abfrage effizient aggregieren?
Eine einzelne Spalte in einer Abfrage mit einer mehrspaltigen Tabelle zusammenfassen
In einer Situation, in der Sie eine Abfrage mit mehreren Spalten haben und eine Aggregation wünschen Eine einzelne bestimmte Spalte kann eine Herausforderung darstellen. Betrachten Sie die folgende Abfrage:
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ') FROM tbl1 t1 LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6 ORDER BY t2.foo5, t2.foo6
Während die Abfrage funktioniert, wird sie ausführlich, da alle nicht aggregierten Felder in den Klauseln GROUP BY und ORDER BY aufgelistet werden müssen. Diese Einschränkung entsteht, weil Aggregate in diesen Klauseln nicht zulässig sind.
Glücklicherweise gibt es für PostgreSQL 9.1 und höher eine einfachere Lösung. Durch die Nutzung des Konzepts der Gruppierung nach Primärschlüsseln kann die Abfrage erheblich vereinfacht werden:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- had to spell out, since no longer in select list!
Wenn die Abfrage jedoch mehrere Tabellen mit komplexen Beziehungen umfasst, kann es effizienter sein, einen alternativen Ansatz zu wählen. Indem zuerst eine Aggregation durchgeführt und dann die Ergebnisse zusammengeführt werden, kann der nicht aggregierte Teil der Abfrage optimiert werden:
SELECT t1.foo1, t1.foo2, ... , t2.bar1, t2.bar2, ... , a.aggregated_col FROM tbl1 t1 LEFT JOIN tbl2 t2 ON ... ... LEFT JOIN ( SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col FROM agg_tbl a ON ... GROUP BY some_id ) a ON a.some_id = ?.some_id ORDER BY ...
In diesem Szenario kann der Großteil der Abfrage ohne Aggregation ausgeführt werden, was zu einer verbesserten Leistung führt.
Das obige ist der detaillierte Inhalt vonWie kann ich eine einzelne Spalte in einer mehrspaltigen SQL-Abfrage effizient aggregieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!