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
Libérer: 2025-01-24 04:47:10
original
373 Les gens l'ont consulté

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal