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() |