PostgreSQL:基于数组(外键)列加入2个表

时间:2018-06-09 06:53:14

标签: sql arrays postgresql select

我正在使用PostgreSQL,我有一个表,我正在保留我的用户,而在另一个表中,我保留了一个包含id和组名的用户组。在用户的表中,我有一个列,我将每个用户的组ID保存在一个数组中。现在我想获取用户的所有数据以及每个用户的组名。我该怎么办?这是一个例子: 用户表:

user_id  name  roles   
1        bob   [1, 2]   
2        jack  [3]

角色表:

role_id  name
 1       ceo
 2       cto
 3       financial

我希望有:

user_id  name   role_name
 1       bob    CEO, cto
 2       jack   financial

1 个答案:

答案 0 :(得分:6)

正如用户LJ01在评论中所说,你应该加入2个表。 如果users和groups表具有以下结构:

CREATE TABLE users (
  id BIGINT,
  name TEXT,
  group_ids BIGINT[]
);

CREATE TABLE groups (
  id BIGINT,
  name TEXT
);

您可以使用以下查询加入表格:

SELECT u.*,g.name FROM users u JOIN groups g ON g.id = ANY (u.group_ids);

因此,如果users表具有以下数据:

id  name    group_ids
1   Test1   {1,2,3}
2   Test2   {3,4}

有4组:

id  name
1   Group1
2   Group2
3   Group3
4   Group4

查询结果为

1   Test1   {1,2,3} Group1
1   Test1   {1,2,3} Group2
1   Test1   {1,2,3} Group3
2   Test2   {3,4}   Group3
2   Test2   {3,4}   Group4

<强>更新 用户要求每个用户使用一行,并将这些组聚合在一行中。这可以通过以下查询来实现:

  SELECT u.id, u.name,array_agg(g.name) group_names FROM users u JOIN groups g ON g.id = ANY (u.group_ids)
  GROUP BY u.id, u.name;

如果我们对答案开始时显示的示例数据执行此查询,我们将得到以下结果:

u.id u.name  group_names
1    Test1   {Group1,Group2,Group3}
2    Test2   {Group3,Group4}