Heim > Datenbank > MySQL-Tutorial > Wie kann ich eine einzelne Spalte in einer mehrspaltigen SQL-Abfrage effizient aggregieren?

Wie kann ich eine einzelne Spalte in einer mehrspaltigen SQL-Abfrage effizient aggregieren?

DDD
Freigeben: 2024-12-16 22:09:18
Original
150 Leute haben es durchsucht

How Can I Efficiently Aggregate a Single Column in a Multi-Column SQL Query?

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage