BigQuery合并条件为字符串时出错:标量子查询返回多行
解决SQL子查询返回多行的错误
错误原因
你写的子查询没有和主表的当前行关联,且直接查询travel.trip360_id会返回多条结果,但CASE WHEN条件里的子查询必须是单行单值的标量结果,因此触发了"Scalar subquery produced more than one element"错误。
解决方案
根据你的需求,核心是判断是否存在匹配且非空的trip360_id,以下两种方案均可解决问题:
方案1:用EXISTS判断存在性(推荐,性能更优)
EXISTS仅检查是否有匹配记录,找到匹配即停止计算,适合这类存在性判断场景:
CASE WHEN channel_name = "X" OR EXISTS ( SELECT 1 FROM `grouponi_groupon.tb_travel_opportunities` AS travel WHERE travel.opportunity_id = snap.order_item_opportunity_id AND travel.trip360_id IS NOT NULL ) THEN "X" ELSE channel_name END AS channel_name
逻辑说明:
- 若原
channel_name为"X",直接返回"X" - 否则检查当前行是否存在关联的
travel记录,且对应的trip360_id不为空,满足则返回"X" - 以上条件都不满足时,返回原
channel_name
方案2:用聚合函数返回标量
通过MAX()或MIN()聚合函数强制子查询返回单行结果,再判断是否非空:
CASE WHEN channel_name = "X" OR ( SELECT MAX(travel.trip360_id) FROM `grouponi_groupon.tb_travel_opportunities` AS travel WHERE travel.opportunity_id = snap.order_item_opportunity_id ) IS NOT NULL THEN "X" ELSE channel_name END AS channel_name
逻辑说明:
- 聚合函数
MAX()会将多行结果合并为单行,只要存在非空的trip360_id,就会返回非空值 - 其余逻辑与需求一致
关键注意点
无论采用哪种方案,必须关联主表snap的order_item_opportunity_id,否则子查询会变成全局范围的查询(检查所有travel记录),而非与当前行匹配的记录,最终结果会不符合预期。
内容的提问来源于stack exchange,提问作者Tzahi
相关产品推荐
相关产品推荐

