首页 >数据库 >mysql教程 >如何解决SQL中GROUP BY和ORDER BY子句冲突导致的ORA-00979错误?

如何解决SQL中GROUP BY和ORDER BY子句冲突导致的ORA-00979错误?

Patricia Arquette
Patricia Arquette原创
2025-01-24 04:37:07534浏览

How to Resolve ORA-00979 Errors Caused by GROUP BY and ORDER BY Clause Conflicts in SQL?

ORA-00979 故障排除:GROUP BYORDER BY 子句冲突

SQL 中的 ORA-00979 错误是由于 GROUP BYORDER BY 子句之间不匹配引起的。 GROUP BY 聚合数据,而 ORDER BY 对数据进行排序。 当 ORDER BY 包含 GROUP BY 中不存在的列时,会发生错误。

理解问题

考虑这个产生 ORA-00979 错误的示例查询:

<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name,
       LISTAGG(TO_CHAR(cf.fact_date, 'mm/dd/yyyy'), ',') WITHIN GROUP (ORDER BY cf.fact_date) AS "appt",
       cs.cs_id, cr.tracking_number
FROM review cr JOIN cs ON cr.cs_sk = cs.cs_sk
JOIN fact cf ON cr.review_sk = cf.review_wk
WHERE UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%'
  AND row_delete_date_time IS NULL
  AND cr.fact_type_code = 183050
GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;</code>

错误源于ORDER BY cs.cs_id, cr.full_namecs.cs_idcr.full_name 不在 GROUP BY 子句中。

解决方案

要解决 ORA-00979,ORDER BY 中的所有列必须位于 GROUP BY 中或聚合:

解决方案 1:添加到 GROUP BY

如果列对于分组至关重要,请将它们包含在 GROUP BY 子句中:

<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;</code>

解决方案 2:使用聚合函数

如果列对于分组并不重要,请使用 MINMAX 等聚合函数或其他适合您数据的函数:

<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number
ORDER BY MIN(cs.cs_id), MIN(cr.full_name);</code>

选择正确的解决方案取决于您的查询逻辑和所需的结果。 添加到 GROUP BY 可以保留更多详细信息,而使用聚合函数可以汇总组内的数据。 在实施之前仔细考虑每种方法的含义。 请记住根据您的数据和期望的结果使用适当的聚合函数。

以上是如何解决SQL中GROUP BY和ORDER BY子句冲突导致的ORA-00979错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn