【问题标题】:Join SQL tables where an element is present in a list连接列表中存在元素的 SQL 表
【发布时间】:2021-12-03 23:57:05
【问题描述】:

我有一个查找我感兴趣的 ID 的子查询,结果如下所示:

+---+
| id|
+---+
| 42|
| 54|
|...|
+---+

然后我有一个更大的表,其中有一列由 ID 列表组成

+------------+
|      id_lst|
+------------+
| [42, 63, 6]|
|  [5, 2, 62]|
|         ...|
+------------+

我想加入这些表,其中表 1 中的 ID 存在于表 2 中的列表中。这些都是非常大的表,我似乎无法找到一种计算成本低廉的方法来加入这些表。

【问题讨论】:

  • 您可以加入,逻辑将取决于您未显示的类型。可能建议的方法是将列表表的设计更改为具有列:(id_list, id_item),列表中的每个项目都有一行。现在我们可以加入 item.id = list.id_item 并使用可用的索引。

标签: sql presto


【解决方案1】:

您可以使用contains 作为连接子句:

WITH dataset (value, id_lst) AS (
    VALUES ('a', array [ 1, 2 ]),
        ('b', array [ 4 ]),
        ('c', array [ 1, 5 ])
),
parent(id) as (
    values (1),
        (2),
        (3),
        (4),
        (5)
)

select id, value
from parent p
join dataset on contains(id_lst, p.id)

输出:

id value
1 a
2 a
4 b
1 c
5 c

或使用UNNEST 将数组扩展为关系并执行“常规”连接:

select p.id,
    value
from parent p
    join (
        select value,
            id
        from dataset
            CROSS JOIN UNNEST (id_lst) as t(id)
    ) c on p.id = c.id 

输出:

id value
2 a
1 c
1 a
4 b
5 c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2011-08-16
    • 2014-01-11
    • 2023-03-24
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多