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

合并不同SQL查询结果集遇错求助:子查询与UNION报错

问题分析与解决

错误原因

你遇到的两个报错本质都是逻辑问题:

  • 「Subquery must return only one column」:SELECT子句里的子查询只能返回单个值,但你写的子查询返回了order_nr和ammountOrders两列,数据库无法识别该取哪一列填充到主查询字段中。
  • 「Each UNION query must have the same number of columns」:UNION要求合并的两个查询列数完全一致,且对应列类型兼容,你之前的两个查询列数不匹配,因此报错。

正确实现方案

你的需求是获取每个用户对应的最后订单日期,以及该订单编号下的总订单数,下面两种写法都能实现:

方法1:子查询关联(兼容多数SQL数据库)

SELECT 
    u.order_nr,
    u.name,
    o_last.last_order_date,
    o_count.total_orders
FROM 
    user u
-- 关联获取每个order_nr的最后订单日期
INNER JOIN 
    (
        SELECT order_nr, MAX(oDate) AS last_order_date
        FROM `order`  -- order是SQL关键字,用反引号包裹避免语法报错
        GROUP BY order_nr
    ) o_last ON u.order_nr = o_last.order_nr
-- 关联获取每个order_nr的订单总数
INNER JOIN 
    (
        SELECT order_nr, COUNT(*) AS total_orders
        FROM `order`
        GROUP BY order_nr
    ) o_count ON u.order_nr = o_count.order_nr

方法2:窗口函数(支持窗口函数的数据库如MySQL 8.0+、PostgreSQL等)

用窗口函数可以更简洁地完成统计,无需多次子查询:

SELECT DISTINCT
    u.order_nr,
    u.name,
    MAX(o.oDate) OVER (PARTITION BY o.order_nr) AS last_order_date,
    COUNT(o.order_nr) OVER (PARTITION BY o.order_nr) AS total_orders
FROM 
    user u
INNER JOIN 
    `order` o ON u.order_nr = o.order_nr

这里PARTITION BY o.order_nr表示按订单编号分组统计,DISTINCT用来去掉重复的结果行。

内容的提问来源于stack exchange,提问作者Neil DeGrasse Tyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:15:34