Oracle中如何在SELECT子查询返回多列?解决ORA-00913错误
解决方案
要解决ORA-00913错误并实现多列统计需求,你需要替换原来的标量子查询写法,改用JOIN + GROUP BY的方式关联表并聚合数据,具体如下:
基础实现(仅返回有数据的日期-类型组合)
SELECT t.day, COUNT(i.item_id) AS cnt, i.item_type, SUM(i.area) AS sum_area FROM calendar t LEFT JOIN item i ON t.day BETWEEN TRUNC(i.start_date) AND TRUNC(i.end_date) GROUP BY t.day, i.item_type ORDER BY t.day DESC, i.item_type;
完整实现(确保所有日期-类型组合都显示,无数据时补0)
如果需要保证每个日历日期下,所有存在的item_type都有一行记录(即使当天没有该类型的物品),可以用CROSS JOIN生成所有可能的日期-类型组合,再左联统计:
WITH all_day_types AS ( SELECT t.day, it.item_type FROM calendar t CROSS JOIN (SELECT DISTINCT item_type FROM item) it ) SELECT adt.day, COUNT(i.item_id) AS cnt, adt.item_type, NVL(SUM(i.area), 0) AS sum_area FROM all_day_types adt LEFT JOIN item i ON adt.day BETWEEN TRUNC(i.start_date) AND TRUNC(i.end_date) AND adt.item_type = i.item_type GROUP BY adt.day, adt.item_type ORDER BY adt.day DESC, adt.item_type;
说明
- 原来的标量子查询作为SELECT列时,强制要求返回单个值,尝试返回多列必然触发ORA-00913错误。
- 使用
LEFT JOIN可以保留calendar表的所有日期,避免遗漏无对应item的日期。 - 通过
GROUP BY t.day, i.item_type,可以按日期和物品类型分组,分别计算每组的物品数量和面积总和。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

