COALESCE嵌套子查询报错:单行子查询返回多行求解决方案
问题解决:Single-row subquery returns more than one row
问题场景
你需要在存储过程中实现:用query_1的去重trx_date过滤主表的transaction_timestamp::DATE;若query_1无数据,则改用query_2处理后的日期(优先取date_1::DATE,为空则取date_2::DATE,去重)过滤。但原SQL执行时报错:
Single-row subquery returns more than one row.
原SQL代码:
WHERE transaction_timestamp::DATE IN (COALESCE( (SELECT DISTINCT trx_date FROM query_1), (SELECT DISTINCT CASE WHEN date_1::DATE IS NOT NULL THEN date_1::DATE ELSE date_2::DATE END AS trx_date FROM query_2) ) )
错误原因
COALESCE函数的参数必须是单个值(比如单个字段、单行子查询结果),但你传入的两个子查询都可能返回多行结果,数据库无法将多行集合作为单个值传入COALESCE,因此触发报错。
解决方案
方案1:用UNION ALL+条件判断合并结果集
这种写法直接生成符合IN要求的多行日期集合,逻辑清晰:
WHERE transaction_timestamp::DATE IN ( -- 优先取query_1的去重日期 SELECT DISTINCT trx_date FROM query_1 UNION ALL -- 仅当query_1无数据时,才取query_2处理后的日期 SELECT DISTINCT CASE WHEN date_1::DATE IS NOT NULL THEN date_1::DATE ELSE date_2::DATE END AS trx_date FROM query_2 WHERE NOT EXISTS (SELECT 1 FROM query_1) )
方案2:用EXISTS+OR分支判断
如果需要更细粒度的逻辑控制,可以用EXISTS拆分条件:
WHERE -- 当query_1有数据时,匹配其日期 EXISTS (SELECT 1 FROM query_1 WHERE query_1.trx_date = transaction_timestamp::DATE) OR ( -- query_1无数据时,匹配query_2处理后的日期 NOT EXISTS (SELECT 1 FROM query_1) AND EXISTS ( SELECT 1 FROM query_2 WHERE (CASE WHEN date_1::DATE IS NOT NULL THEN date_1::DATE ELSE date_2::DATE END) = transaction_timestamp::DATE ) )
内容的提问来源于stack exchange,提问作者Robertino Bonora
相关产品推荐
相关产品推荐

