首页 > 数据库 > mysql教程 > 为什么我的 SQL 查询会导致 ORA-00979 错误,如何修复它?

为什么我的 SQL 查询会导致 ORA-00979 错误,如何修复它?

Susan Sarandon
发布: 2025-01-24 04:47:10
原创
333 人浏览过

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

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 非聚合列,或应用聚合函数(例如 COUNTSUMMINMAX, 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_idGROUP BY。 或者,如果您只需要 cr.full_namecs.cs_id 的聚合结果,则应在 SELECT 语句中使用适当的聚合函数。 通过确保 SELECT 列表中的每一列都已聚合或包含在 GROUP BY 子句中,可以消除 ORA-00979 错误。 删除 tolist() 函数也有助于解决问题,因为它不是聚合函数。

以上是为什么我的 SQL 查询会导致 ORA-00979 错误,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板