PostgreSQL执行LEFT JOIN LATERAL ON TRUE语句报错排查及实现方法
问题原因
你混淆了官方示例中的返回集合函数与本地创建的同名表:
官方示例里的get_product_names(m.id)是自定义的集合返回函数(SRF),而你本地仅创建了名为get_product_names的普通关系表,直接写get_product_names(m.id)会被PostgreSQL判定为函数调用,自然抛出找不到对应函数的错误。
正确实现LEFT JOIN LATERAL逻辑的写法
如果要使用LATERAL语法实现需求,将函数调用位置替换为可引用左表字段的关联子查询即可:
SELECT m.name FROM manufacturers m LEFT JOIN LATERAL ( SELECT product FROM get_product_names WHERE id = m.id ) pname ON true WHERE pname.product IS NULL;
执行后返回的结果为没有对应产品的制造商:m3、m5,符合预期。
补充说明
当前场景不使用LATERAL也可以用普通LEFT JOIN实现相同效果,写法更简洁:
SELECT m.name FROM manufacturers m LEFT JOIN get_product_names gpn ON m.id = gpn.id WHERE gpn.id IS NULL;
LATERAL更适合针对左表每行做子查询的场景,比如按制造商分组取最新的2条产品记录、调用自定义集合返回函数做关联等。
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

