Maison > base de données > tutoriel mysql > Comment puis-je agréger efficacement une seule colonne dans une requête SQL multi-colonnes ?

Comment puis-je agréger efficacement une seule colonne dans une requête SQL multi-colonnes ?

DDD
Libérer: 2024-12-16 22:09:18
original
213 Les gens l'ont consulté

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

Agréger une seule colonne dans une requête avec une table multi-colonnes

Dans une situation où vous avez une requête avec plusieurs colonnes et souhaitez agréger une seule colonne spécifique, cela peut présenter un défi. Considérez la requête suivante :

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
Copier après la connexion

Pendant que la requête fonctionne, elle devient verbeuse en raison de la nécessité de répertorier tous les champs non agrégés dans les clauses GROUP BY et ORDER BY. Cette contrainte survient car les agrégats ne sont pas autorisés dans ces clauses.

Heureusement, pour PostgreSQL 9.1 et versions ultérieures, une solution plus simple existe. En tirant parti du concept de regroupement par clés primaires, la requête peut être considérablement simplifiée :

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!
Copier après la connexion

Cependant, si la requête implique plusieurs tables avec des relations complexes, il peut être plus efficace d'adopter une approche alternative. En effectuant d'abord l'agrégation, puis en joignant les résultats, la partie non agrégée de la requête peut être optimisée :

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 ...
Copier après la connexion

Dans ce scénario, la majorité de la requête peut se dérouler sans agrégation, ce qui entraîne une amélioration des performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal