PostgreSQL执行select嵌套子查询报错42601:VQ非SUPER类型无法导航
错误原因
你遇到的报错是PostgreSQL类数据库(含Redshift)的语法限制导致的,核心问题有2个:
- SELECT子句中的标量子查询仅允许返回单个值,你编写的子查询返回了多字段、可能多行的结果集,被作为行类型赋值给别名
VQ后,PostgreSQL默认不支持用VQ.a的点语法直接访问行内字段,只有SUPER类型等特殊类型才支持该操作 - 子查询未和外层查询做关联,即使语法兼容,最终返回的
VQ数据也会和外层行不匹配,甚至出现多行返回的报错
修复方案
把嵌套在SELECT中的子查询移动到FROM子句,改为关联表的形式即可,调整后的代码如下:
select t.col1, b.somecolumn, t.col2, a.col1, VQ.a, VQ.b, VQ.e, VQ.d, VQ.f from table_A t join table_C a on t.col1 = a.asset_id join table_B b on t.somecolumn = b.somecolumn -- 根据需求可选 LEFT JOIN / INNER JOIN left join ( select t_inner.a as join_key, t_inner.status as a, p.id as b, p.permit as c, p.des as d, p.error_code as e, p.cause as f from table_A t_inner inner join table_B p on t_inner.a = p.a where p.c = 'license' and t_inner.status = 'Fail' ) as VQ on t.a = VQ.join_key;
注意事项
- 原代码
b.somecolumn t.col2漏写了逗号,已修正为b.somecolumn, t.col2 - 如果要求仅返回子查询有匹配结果的行,把
LEFT JOIN替换为INNER JOIN即可 - 子查询新增了
join_key用于和外层的table_A关联,确保每行的VQ数据和当前行对应,避免笛卡尔积问题
内容的提问来源于stack exchange,提问作者Swathi Ravindran
相关产品推荐
相关产品推荐

