Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL génère-t-elle une erreur ORA-00979 et comment puis-je la corriger ?
Dépannage ORA-00979 : un problème SQL GROUP BY courant
La redoutable erreur ORA-00979 apparaît souvent lorsque vous travaillez avec la clause GROUP BY
de SQL. Cette erreur signifie une inadéquation entre les colonnes sélectionnées et celles regroupées. Plus précisément, cela se produit lorsque les instructions SELECT
incluent des colonnes non présentes dans la clause GROUP BY
, ou lorsque des fonctions non agrégées sont appliquées à des colonnes non regroupées.
Examinons une requête problématique :
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt", cs.cs_id, cr.tracking_number FROM review cr, cs, fact cf WHERE cr.cs_sk = cs.cs_sk AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.review_sk = cf.review_wk(+) AND cr.fact_type_code (+) = 183050 GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number ORDER BY cs.cs_id, cr.full_name;</code>
Cette requête déclenche ORA-00979 car la clause GROUP BY
est incomplète. Pour remédier à cela, incluez toutes colonnes non agrégées de la liste SELECT
dans la clause GROUP BY
, ou appliquez des fonctions d'agrégation (comme COUNT
, SUM
, MIN
, MAX
, AVG
) aux colonnes non explicitement regroupées.
Voici une version corrigée :
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, to_char(cf.fact_date, 'mm/dd/yyyy') "appt", cs.cs_id, cr.tracking_number FROM review cr, cs, fact cf WHERE cr.cs_sk = cs.cs_sk AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.review_sk = cf.review_wk(+) AND cr.fact_type_code (+) = 183050 GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cr.full_name, cs.cs_id ORDER BY cs.cs_id, cr.full_name;</code>
Le changement clé consiste à ajouter cr.full_name
et cs.cs_id
à la clause GROUP BY
. Alternativement, si vous n'avez besoin que de résultats agrégés pour cr.full_name
et cs.cs_id
, des fonctions d'agrégation appropriées doivent être utilisées dans l'instruction SELECT
. En garantissant que chaque colonne de la liste SELECT
est soit agrégée, soit incluse dans la clause GROUP BY
, l'erreur ORA-00979 est éliminée. La suppression de la fonction tolist()
aide également à résoudre le problème car il ne s'agit pas d'une fonction d'agrégation.
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!