合并不同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
相关产品推荐
相关产品推荐

