如何筛选含type='X'组件的对象并保留其所有关联组件?
解决方法
有两种常用方式可以实现你的需求:既能筛选出关联了type='X'组件的对象,又能完整保留每个对象的所有关联组件:
方法一:子查询筛选目标对象ID
先从表B中提取所有关联了type='X'组件的对象ID,再基于这些ID关联表A和表B的全量数据并聚合:
SELECT A.*, ARRAY_AGG(B.*) FROM A INNER JOIN B USING(id) WHERE A.id IN ( SELECT id FROM B WHERE type = 'X' ) GROUP BY A.*
方法二:EXISTS子句做存在性判断
通过EXISTS子句直接校验当前对象是否存在type='X'的组件记录,满足条件则保留该对象并关联所有组件:
SELECT A.*, ARRAY_AGG(B.*) FROM A INNER JOIN B USING(id) WHERE EXISTS ( SELECT 1 FROM B AS B2 WHERE B2.id = A.id AND B2.type = 'X' ) GROUP BY A.*
这两种查询都会返回你预期的结果:仅保留id为1和3的对象,同时包含它们的所有关联组件。在你的SQLX Rust项目中,这两种写法均可直接使用(适配PostgreSQL等支持ARRAY_AGG的数据库)。
内容的提问来源于stack exchange,提问作者GhostCrab
相关产品推荐
相关产品推荐

