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