PostgreSQL如何实现类似LINQ SelectMany的表函数多结果集合并
PostgreSQL实现类LINQ SelectMany功能的方案
你需要的功能可以通过PostgreSQL原生的LATERAL关联直接实现,不需要编写任何循环逻辑。
实现原理
LATERAL关联支持在子查询/表函数执行时,引用左侧关联表的当前行字段值,刚好可以实现对源表每一个id调用返回表函数、再合并所有结果的需求,和LINQ的SelectMany语义完全匹配。
代码示例
假设你获取批量in_ID的查询是SELECT id FROM 你的源表名,直接使用如下语句即可:
SELECT g.* FROM 你的源表名 t CROSS JOIN LATERAL get_objects(t.id) g;
如果需要保留源表中调用函数返回空结果的id记录,可以改用左关联版本:
SELECT t.id AS 源ID, g.name, g.id_out FROM 你的源表名 t LEFT JOIN LATERAL get_objects(t.id) g ON TRUE;
补充说明
- 语法上
CROSS JOIN LATERAL可以简写为, LATERAL get_objects(t.id),但显式写关联语义更清晰,可读性更好 - 这种原生语法的执行效率远高于手动循环拼接结果的实现,适合大数据量场景使用
- 最终返回的结果就是所有调用
get_objects返回的行的合并集合,完全符合需求
内容的提问来源于stack exchange,提问作者DuckQueen
相关产品推荐
相关产品推荐

