连接多个表Oracle中的多个列

时间:2017-01-20 01:26:16

标签: sql oracle concatenation

很抱歉,如果有人问这个问题,请稍微搜索一下并且找不到我喜欢的东西,但如果有的话请链接。

我正在使用Oracle并尝试在不使用临时表的情况下在多个表中的多个列中聚合结果。示例如下:

Table: USERS
--------------
ID | USER_NAME
--------------
1  | Bob
2  | Joe
3  | Mary

Table: PROJECT_USERS
----------------------------------
USER_ID | PROJECT_ID | ACCESS_TYPE
----------------------------------
1       |123         |8
1       |456         |9
1       |789         |10
2       |123         |10
2       |456         |9
2       |789         |8
3       |123         |9
3       |456         |10
3       |789         |10

我已经能够使用LISTAGG取得一些成功,例如使用以下查询查找特定项目输出中的用户:

SELECT
    LISTAGG(users.user_name, ',') WITHIN GROUP (ORDER BY users.user_name)
FROM
    users,
    project_users
WHERE
    project_users.user_id = users.id
    AND project_users.project_id = 123
GROUP BY ID
;

(道歉,如果上面的语法稍微偏离,因为原因模糊了实际的结构和数据,所以这不是我正在使用的确切查询) 哪个会输出:

Bob,Joe,Mary

但我想要输出的是USERS.USER_NAME和PROJECT_USERS.ACCESS_TYPE的组合,它们以类似的格式汇总,也许两个值用 - 分隔 -

Bob-8,Joe-10,Mary-9

我可以获得个人回报

SELECT users.user_name || '-' || project_users.access_type...

返回

Bob-8
Joe-9
Mary-10

并希望我能够将这些结果列入LISTAGG,但遗憾的是无法让它发挥作用。如前所述,临时表是正确的,因为我不想进入,但我相信这会让事情变得更容易。使用FROM中的SELECT不起作用,我不认为,因为最后我希望能够在子查询中使用它,而我的理解(以及尝试它的经验有限)是它不能正确迭代每一次通过。也许我错了,但是做错了。

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

看来你想要这样的东西。不知道为什么你想要它(在这种情况下),但它说明了你问的方法。

arr = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': nil, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]

arr.flat_map(&:to_a).group_by(&:first).each_with_object({}) { |(k,v),h|
  h[k] = v.map(&:last).compact }
  #=> {:a=>[1, 4, 7], :b=>[2, 8], :c=>[3, 6, 9]}