ORA-00979 故障排除:常见 SQL GROUP BY 问题
使用 SQL 的 GROUP BY
子句时,经常会出现可怕的 ORA-00979 错误。 此错误表示所选列与分组列之间不匹配。 具体来说,当 SELECT
语句包含 GROUP BY
子句中不存在的列时,或者当非聚合函数应用于未分组的列时,就会出现这种情况。
让我们检查一个有问题的查询:
<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>
此查询会触发 ORA-00979,因为 GROUP BY
子句不完整。 要纠正此问题,请在 子句中包含 列表中的 SELECT
所有 GROUP BY
非聚合列,或应用聚合函数(例如 COUNT
、SUM
、MIN
、MAX
, AVG
) 到那些未明确分组的列。
这是更正后的版本:
<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>
关键的变化是在 cr.full_name
子句中添加 cs.cs_id
和 GROUP BY
。 或者,如果您只需要 cr.full_name
和 cs.cs_id
的聚合结果,则应在 SELECT
语句中使用适当的聚合函数。 通过确保 SELECT
列表中的每一列都已聚合或包含在 GROUP BY
子句中,可以消除 ORA-00979 错误。 删除 tolist()
函数也有助于解决问题,因为它不是聚合函数。
以上是为什么我的 SQL 查询会导致 ORA-00979 错误,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!