Snowflake select中需要不相关子查询时如何解决?

问题描述 投票:0回答:1

数据库:雪花

DBT生成sql模型

我的表中有一个列,其中包含用户拥有的产品 ID 列表。

表:用户

用户 ID 名字
u1 用户1
u2 用户2

表:产品

产品_id 产品名称
1 A
2 B
3 C

表:用户属性

日期 用户 ID 产品列表
2024-12-01 u1 1,2,3
2024-12-01 u2 2,3,4
2024-12-02 u1 2,3
2024-12-02 u2 2,3,4

现在,我想返回用户拥有的产品名称

预期产出

日期 用户 ID 产品名称
2024-12-01 u1 A、B、C
2024-12-01 u2 B、C、D

我尝试了此操作,但收到错误无法评估不支持的子查询类型

select *, product_list,
(select listagg(product_name, ',') from products where 
            product_id in (select value from table(split_to_table(product_list, ',')))
            ) as product_names
from users_attributes ua
left join users u on ua.user_id = u.user_id

当我尝试在子查询中对product_list进行硬编码时,它可以执行,但当然这不是我想要的。

select *, product_list,
(select listagg(product_name, ',') from products where 
            product_id in (select value from table(split_to_table('1,2', ',')))
            ) as product_names
from users u
left join user_attributes ua on u.user_id = ua.user_id
sql snowflake-cloud-data-platform
1个回答
0
投票

我用 CTE 尝试了这一点,并找到了一种方法来获得您需要的结果。基本上,我解压缩了该产品列表列,将属性加入到产品和用户中,然后再次将其压缩回来。

WITH split_attributes as (
   SELECT date,
     user_id,
     value as product_id
   FROM user_attributes, LATERAL SPLIT_TO_TABLE(product_list, ','))
SELECT
   users.user_id,
   users.name,
   split_attributes.date,
   LISTAGG(products.product_name,',') AS product_names
FROM users
LEFT JOIN split_attributes
   ON split_attributes.user_id = users.user_id
LEFT JOIN products
   ON split_attributes.product_id = products.product_id
GROUP BY split_attributes.date, users.user_id, users.user_id;
© www.soinside.com 2019 - 2024. All rights reserved.