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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:43:17