ORA-00979 故障排除:GROUP BY
和 ORDER BY
子句冲突
SQL 中的 ORA-00979 错误是由于 GROUP BY
和 ORDER 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_name
。 cs.cs_id
和 cr.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:使用聚合函数
如果列对于分组并不重要,请使用 MIN
、MAX
等聚合函数或其他适合您数据的函数:
<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中文网其他相关文章!