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
相关产品推荐
相关产品推荐

