Oracle查询高于均费的网络套餐费用时报ORA-01427错误求解决方案
错误原因
你触发ORA-01427报错的核心原因是WHERE子句中左侧的子查询会返回所有套餐使用记录的总费用,是多行结果,无法直接和右侧返回单值的平均费用做比较。此外你提交的SQL还存在3处语法问题:
network_pacakage字段后缺少分隔逗号to_char函数的左括号多写了一个- 字段名拼写错误:你说明里
menu表的小时费用字段是cost_per_hour,SQL里写成了cost_per_hours
可行解决方案
推荐使用窗口函数实现,不需要多次关联表,执行效率更高:
SELECT network_package, to_char(total_cost, '$999.99') AS total_costs FROM ( SELECT m.network_package, m.cost_per_hour * (ul.start_hours - ul.end_hours) AS total_cost, -- 窗口函数计算所有记录的平均总费用,作为每行的附加字段 AVG(m.cost_per_hour * (ul.start_hours - ul.end_hours)) OVER() AS avg_total_cost FROM menu m JOIN user_log ul ON m.package_id = ul.package_id ) t WHERE total_cost > avg_total_cost ORDER BY total_costs DESC;
如果需要按套餐维度聚合统计(同一个套餐的多条使用记录合并计算总费用),可以调整为聚合写法:
SELECT network_package, to_char(total_cost, '$999.99') AS total_costs FROM ( SELECT m.network_package, SUM(m.cost_per_hour * (ul.start_hours - ul.end_hours)) AS total_cost, AVG(SUM(m.cost_per_hour * (ul.start_hours - ul.end_hours))) OVER() AS avg_total_cost FROM menu m JOIN user_log ul ON m.package_id = ul.package_id GROUP BY m.package_id, m.network_package ) t WHERE total_cost > avg_total_cost ORDER BY total_costs DESC;
注意事项
请根据实际业务表的字段拼写调整SQL中的字段名,避免因拼写问题触发语法报错。
内容的提问来源于stack exchange,提问作者YKILYCHAN
相关产品推荐
相关产品推荐

