解决查询中“Scalar subquery produced more than one element”报错问题
问题修复方案
你遇到的「Scalar subquery produced more than one element」错误,核心原因是子查询没有和主表关联:那个统计订单数的子查询直接对所有订单按仓库分组,会返回所有仓库的订单统计结果(多行数据),但主查询的每个仓库行只能对应一个单一的订单数值,因此触发报错。
下面给出两种可行的修复写法:
写法一:利用JOIN直接聚合(推荐)
既然已经关联了仓库表和订单表,直接通过聚合函数统计即可,同时解决你提到的「无法同时对warehouse_id和warehouse_alias分组」的问题:
SELECT CONCAT(warehouse.warehouse_id, warehouse.warehouse_alias) AS warehouse_name, COUNT(orders.order_id) AS total_orders -- 用订单ID计数更精准,避免重复统计 FROM focused-mote-392209.warehouse_orders.warehouse AS warehouse INNER JOIN focused-mote-392209.warehouse_orders.orders AS orders ON warehouse.warehouse_id = orders.warehouse_id GROUP BY warehouse.warehouse_id, warehouse.warehouse_alias -- 直接分组原始字段,比CONCAT更可靠,避免不同仓库出现相同warehouse_name
BigQuery允许在SELECT中使用原始字段的拼接结果,只要GROUP BY里包含这些原始字段即可,不需要只分组拼接后的字符串。
写法二:关联子查询
如果坚持用子查询,必须让子查询和主表的仓库ID关联,确保每个仓库只返回自己的订单数:
SELECT CONCAT(warehouse.warehouse_id, warehouse.warehouse_alias) AS warehouse_name, (SELECT COUNT(*) FROM focused-mote-392209.warehouse_orders.orders AS o WHERE o.warehouse_id = warehouse.warehouse_id) AS total_orders FROM focused-mote-392209.warehouse_orders.warehouse AS warehouse -- 若要排除无订单的仓库,可添加以下条件 WHERE EXISTS ( SELECT 1 FROM focused-mote-392209.warehouse_orders.orders AS o WHERE o.warehouse_id = warehouse.warehouse_id )
内容的提问来源于stack exchange,提问作者Fahrettin Gazi
相关产品推荐
相关产品推荐

