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

Supabase查询报错:子查询返回多行,求排查解决方法

解决Supabase查询关联表报错问题

问题原因

报错more than one row returned by a subquery used as an expression是因为你用的嵌套查询语法(select("*, bands(*)"))默认会把关联表数据作为单个对象返回,但PostgreSQL不允许子查询返回多行作为表达式——哪怕实际只有一行数据,也可能因关联逻辑或查询语法的问题触发这个错误。

解决方案

方案1:用内连接直接查询乐队数据

直接从bands表出发,通过bands_profiles关联用户,返回结果就是乐队本身的数据,用法更直观:

const usersBands = await supabase
  .from("bands")
  .select("*")
  .innerJoin("bands_profiles", "bands.id", "bands_profiles.band_id")
  .eq("bands_profiles.profile_id", userResponse.data.user.id);

之后直接通过usersBands.data[0].name就能获取乐队名称。

方案2:用聚合函数处理关联数据

如果需要保留bands_profiles的原始数据,同时获取关联的乐队数组,可使用array_agg聚合函数,确保关联数据以数组形式返回:

const usersBands = await supabase
  .from("bands_profiles")
  .select(`
    *,
    bands:array_agg(bands(*))
  `)
  .eq("profile_id", userResponse.data.user.id)
  .groupBy("id"); // 这里的"id"替换为bands_profiles表的主键字段名

此时乐队数据会存在usersBands.data[0].bands数组中,通过usersBands.data[0].bands[0].name获取名称。

额外检查

确认bands_profiles表中的band_id字段已正确设置为外键,关联到bands表的主键(通常是id),错误的外键关联也可能导致查询异常。

内容的提问来源于stack exchange,提问作者OrhanC1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:33:19