PostgreSQL中的LATERAL查询
在我的实际场景中,有两张表,一张用户表sys_user。
id | username |
---|---|
1 | Leon |
2 | Dirty |
还有一张用户与角色的关系表user_role_rel。
user_id | role_id |
---|---|
1 | 2 |
1 | 4 |
2 | 3 |
现在需要查询出用户信息,信息中包含角色的id列表。大概长这样。
id | username | roles |
---|---|---|
1 | Leon | {2,4} |
2 | Dirty | {3} |
普通的方式,我们可以先连接再聚合。
1 | WITH t AS ( |
PostgreSQL给我们提供了另外一种方式,LATERAL子查询。
1 | SELECT A.*, C.roles |
LATERAL允许引用前面的FROM项提供的列。
用SQLAlchemy ORM
来写,就像是这样:
1 | subq = session.query(func.array_agg(UserRoleRel.role_id).label("roles")).filter(User.id == UserRoleRel.user_id).subquery().lateral() |