You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:32:03