ORA-00979错误求助:编写符合要求的SQL查询语句
解决ORA-00979错误并满足你的SQL查询需求
嘿,作为SQL初学者遇到分组问题太正常了,我来一步步帮你理清问题并给出正确的查询:
先分析你遇到的两个问题
1. 第一个无错误但不符合需求的查询
SELECT QUOT.sname, ORD.Qtyordered,SUM(ORD.QTYORDERED) from Quotation QUOT inner join Orders ORD ON QUOT.QuotationId = ORD.QuotationId GROUP BY QUOT.sname HAVING SUM(ORD.QTYORDERED) >=100
这个查询没报错,但存在两个核心问题:
- 你选中了
ORD.Qtyordered(单条订单的订购数量),但GROUP BY只按供应商名称分组,这会导致每条分组返回的Qtyordered是随机的单条订单数量,完全不是你需要的总订购数量 - 没有包含需求要求的
Itemcode字段,根本没满足“显示订购商品itemcode”的核心要求
2. 触发ORA-00979错误的查询
SELECT QUOT.Itemcode, QUOT.sname, ORD.Qtyordered, SUM(ORD.QTYORDERED) from Quotation QUOT inner join Orders ORD ON QUOT.QuotationId = ORD.QuotationId GROUP BY QUOT.sname HAVING SUM(ORD.QTYORDERED) >=100
Oracle的ORA-00979错误本质是:SELECT子句中所有非聚合函数的字段,必须全部出现在GROUP BY子句中。你这里选中了QUOT.Itemcode和ORD.Qtyordered,但GROUP BY只有QUOT.sname,Oracle无法确定这些非聚合字段如何和分组后的聚合结果对应,所以直接报错。
正确的查询语句
根据你的需求(显示itemcode、供应商名称、总订购数量,且总数量≥100),正确的写法应该是:
SELECT QUOT.Itemcode, QUOT.sname, SUM(ORD.QTYORDERED) AS total_ordered_quantity FROM Quotation QUOT INNER JOIN Orders ORD ON QUOT.QuotationId = ORD.QuotationId GROUP BY QUOT.Itemcode, QUOT.sname -- 所有非聚合字段必须加入GROUP BY HAVING SUM(ORD.QTYORDERED) >= 100
关键说明:
- GROUP BY子句:加入了
QUOT.Itemcode和QUOT.sname,这两个都是SELECT里的非聚合字段,完全符合Oracle的分组规则 - SELECT子句:去掉了多余的
ORD.Qtyordered,只保留你需要的三个核心内容:商品编码、供应商名称,以及用SUM()计算的总订购数量,还给聚合结果起了一个清晰的别名total_ordered_quantity - HAVING子句:继续保留对总订购数量的过滤条件,确保只返回总数量≥100的记录
这样写既不会触发错误,也完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者Mr.A I




