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
DDDoriginal
2024-12-16 22:09:18154parcourir

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

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!

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 ...

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!

Déclaration:
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