You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.ItemcodeORD.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.ItemcodeQUOT.sname,这两个都是SELECT里的非聚合字段,完全符合Oracle的分组规则
  • SELECT子句:去掉了多余的ORD.Qtyordered,只保留你需要的三个核心内容:商品编码、供应商名称,以及用SUM()计算的总订购数量,还给聚合结果起了一个清晰的别名total_ordered_quantity
  • HAVING子句:继续保留对总订购数量的过滤条件,确保只返回总数量≥100的记录

这样写既不会触发错误,也完全满足你的需求啦!

内容的提问来源于stack exchange,提问作者Mr.A I

火山引擎 最新活动