【问题标题】:Getting array's matching value on joined table在连接表上获取数组的匹配值
【发布时间】:2020-10-15 11:33:21
【问题描述】:

我目前在 Presto 数据库中,并且在 TableA 上有一个 ID 数组:["A", "B", "C", "D"]

如何使用连接映射 TableB(如下)返回具有相应颜色的数组? ["red", "yellow", "blue", "brown"]

|  ID  | color  |
|---------------+
|  A   | red    |
|  B   | yellow |
|  C   | blue   |
|  D   | brown  |

我打算取消嵌套数组,然后执行我的 JOIN,但我已经在处理很多列,所以我想知道是否有更简单的方法。

谢谢!

【问题讨论】:

    标签: arrays join presto


    【解决方案1】:

    数组函数可用于连接条件。这对我来说也不是很明显,但它使编写您正在寻找的查询变得简单。例如:

    SELECT
      user_colors.user_id,
      ARRAY_AGG(color_lookup.color)
    FROM user_colors
    JOIN color_lookup ON CONTAINS(user_colors.color_ids, color_lookup.id)
    GROUP BY user_colors.user_id
    

    假设 user_colors 是具有颜色 ID 数组的表,即您的 TableA。


    写完上面的内容后,我开始想一定有一种方法可以根据查找表获取 MAP。还有!虽然,这有点奇怪,因为据我所知,它必须无条件地加入每一行。结构为子选择,它看起来像这样:

    SELECT
      TRANSFORM(color_ids, x -> color_map[x])
    FROM TableA
    JOIN (
      SELECT MAP_AGG(id, color) AS color_map
      FROM TableB
    ) ON 1 = 1
    

    但它也可以构造为 CTE 或 WITH 子句:

    WITH color_lookup AS (
        SELECT MAP_AGG(id, color) AS color_map
        FROM TableB
    )
    SELECT
      TRANSFORM(color_ids, x -> color_map[x])
    FROM TableA
    JOIN color_lookup ON 1 = 1
    

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多