Heim >Datenbank >MySQL-Tutorial >Warum führt meine SQL-Abfrage zu einem ORA-00979-Fehler und wie kann ich ihn beheben?

Warum führt meine SQL-Abfrage zu einem ORA-00979-Fehler und wie kann ich ihn beheben?

Susan Sarandon
Susan SarandonOriginal
2025-01-24 04:47:10338Durchsuche

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

Fehlerbehebung bei ORA-00979: Ein häufiges SQL-GROUP-BY-Problem

Der gefürchtete ORA-00979-Fehler tritt häufig auf, wenn mit der GROUP BY-Klausel von SQL gearbeitet wird. Dieser Fehler weist auf eine Nichtübereinstimmung zwischen den ausgewählten und den gruppierten Spalten hin. Dies tritt insbesondere dann auf, wenn SELECT-Anweisungen Spalten enthalten, die nicht in der GROUP BY-Klausel enthalten sind, oder wenn Nicht-Aggregatfunktionen auf nicht gruppierte Spalten angewendet werden.

Lassen Sie uns eine problematische Abfrage untersuchen:

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

Diese Abfrage löst ORA-00979 aus, da die GROUP BY-Klausel unvollständig ist. Um dies zu beheben, schließen Sie entweder alle nicht aggregierte Spalten aus der SELECT-Liste in die GROUP BY-Klausel ein oder wenden Sie Aggregatfunktionen an (wie COUNT, SUM, MIN, , MAX) auf die Spalten, die nicht explizit gruppiert sind.AVG

Hier ist eine korrigierte Version:

<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>
Die wichtigste Änderung besteht darin,

und cr.full_name zur cs.cs_id-Klausel hinzuzufügen. Wenn Sie alternativ nur aggregierte Ergebnisse für GROUP BY und cr.full_name benötigen, sollten entsprechende Aggregatfunktionen in der cs.cs_id-Anweisung verwendet werden. Indem sichergestellt wird, dass jede Spalte in der SELECT-Liste entweder aggregiert oder in der SELECT-Klausel enthalten ist, wird der ORA-00979-Fehler beseitigt. Das Entfernen der Funktion GROUP BY trägt ebenfalls zur Behebung des Problems bei, da es sich nicht um eine Aggregatfunktion handelt.tolist()

Das obige ist der detaillierte Inhalt vonWarum führt meine SQL-Abfrage zu einem ORA-00979-Fehler und wie kann ich ihn beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn