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 ?

Pourquoi ma requête SQL génère-t-elle une erreur ORA-00979 et comment puis-je la corriger ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-24 04:47:10338parcourir

Why Does My SQL Query Result in an ORA-00979 Error, and How Can I Fix It?

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!

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