我被要求在Postgresql 9.2上开发一个查询,我只有有限的曝光,它将返回用户信息(来自users
表)及其角色(来自{{1}表格 - 用户可能有很多角色)在一行中。我所拥有的是:
role
我需要得到的是:
[user table] --> [user_role table] <-- [role table]
users table: id, firstname, lastname, username, ... ;
user_role table: id, user_id (fk to user);
role_id (fk to role); role table: id, name;
答案 0 :(得分:2)
像这样的东西,我希望:
SELECT u.id, u.firstname, u.lastname, array_agg(r.name)
FROM user u
LEFT OUTER JOIN user_role ur ON (u.id = ur.user_id)
LEFT OUTER JOIN role r ON (ur.role_id = r.id)
GROUP BY u.id;
根据所需的输出格式,您可能需要string_agg
而不是array_agg
。
由于您未提供样本数据,因此未经测试。如果您使用的是旧的PostgreSQL版本,则需要明确指定user
列表中SELECT
列表中显示的GROUP BY
的每一列。
请注意,角色将在单个列中返回。那是必要的;不支持动态宽度表,其中不同的行可以具有不同的宽度。您可以使用几乎任何您喜欢的格式 - 分隔文本,xml,json,hstore,数组等。
您的user_role.id
列完全没有必要,除非您正在处理无法处理复合主键的愚蠢ORM,否则应该替换为PRIMARY KEY(user_id, role_id)
。