Maison >base de données >tutoriel mysql >Pourquoi ma requête PostgreSQL GROUP BY échoue-t-elle alors que MySQL réussit ?

Pourquoi ma requête PostgreSQL GROUP BY échoue-t-elle alors que MySQL réussit ?

DDD
DDDoriginal
2025-01-18 09:56:12718parcourir

Why Does My PostgreSQL GROUP BY Query Fail While MySQL Succeeds?

Clause GROUP BY stricte de PostgreSQL et gestion des erreurs

L'exécution d'une requête comme SELECT * FROM the_table GROUP BY col2 dans PostgreSQL entraîne l'erreur : "la colonne "the_table.col3" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation." En effet, PostgreSQL adhère strictement aux normes SQL, exigeant que toutes les colonnes de la liste SELECT soient incluses dans la clause GROUP BY ou fassent partie d'une fonction d'agrégation.

Fonctions agrégées : la solution

Les fonctions d'agrégation, telles que SUM(), MIN(), MAX(), AVG() et COUNT(), calculent une valeur unique à partir d'un ensemble de valeurs. Pour corriger l'erreur PostgreSQL, vous devez appliquer une fonction d'agrégation à toute colonne non présente dans la clause GROUP BY.

Comportement non standard de MySQL

La gestion plus indulgente de GROUP BY par MySQL est une extension non standard. Il permet de sélectionner des colonnes non agrégées ne figurant pas dans la clause GROUP BY, mais les valeurs sélectionnées sont non déterministes ; MySQL sélectionne essentiellement une valeur arbitraire dans chaque groupe pour ces colonnes. Cela peut conduire à des résultats imprévisibles et incohérents.

L'approche plus stricte de PostgreSQL garantit des résultats de requête cohérents et reproductibles.

Correction de la requête PostgreSQL

Pour corriger la requête PostgreSQL, utilisez une fonction d'agrégation sur col3 (et sur toute autre colonne ne figurant pas dans la clause GROUP BY). Par exemple :

<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table
GROUP BY col2;</code>

Cette requête révisée utilise MIN() pour sélectionner la valeur minimale de col3 pour chaque groupe défini par col2. Vous devez choisir la fonction d'agrégation appropriée (par exemple, MAX(), AVG()) en fonction du résultat souhaité.

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