PostgreSQL 10:如何将常量值与返回多行的子查询结合查询?
解决PostgreSQL中子查询作为表达式返回多行的报错问题
这个报错的核心原因很明确:当你在SELECT列表里把子查询当作表达式使用时,PostgreSQL要求这个子查询必须返回恰好1行结果,但你的(SELECT name FROM foo)会返回foo表中所有的name行,自然触发了21000的"多行子查询用作表达式"错误。
因为你明确要求必须保留子查询的结构,这里提供两种贴合需求的解决方案:
方案1:通过关联外部查询让子查询返回单行
把子查询和外部的foo表行做关联,确保每个子查询只返回当前行对应的name:
SELECT 1, (SELECT name FROM foo f WHERE f.id = foo.id) AS name FROM foo;
这种写法的好处是完全保留了"SELECT列表里带子查询"的结构,适合需要在复杂业务逻辑中针对每行单独计算子查询的场景。
方案2:用LATERAL连接实现行级子查询展开
如果你的子查询不需要和外部行关联,只是想把固定值1和foo表的所有name做组合,可以用CROSS JOIN LATERAL把多行子查询转为可连接的数据源:
SELECT 1, sub.name FROM (SELECT 1) AS dummy CROSS JOIN LATERAL (SELECT name FROM foo) AS sub;
这种写法更灵活,即使子查询是复杂的多行逻辑,也能通过LATERAL连接和外部的数据源(这里的dummy表提供固定值1)做交叉组合,完美匹配你期望的"1 对应每个name"的结果。
为什么原来的写法不行?
你最初的SELECT 1, (SELECT name FROM foo)相当于让数据库把一个返回多行的结果塞进一个单一的列位置,数据库无法处理这种"一对多"的映射,必须通过关联或连接的方式把多行子查询的结果和外部行做一一对应,才能得到合法的结果集。
内容的提问来源于stack exchange,提问作者Caballero
相关产品推荐
相关产品推荐

