我们从DB2迁移到雪花,在使用“values”子句时遇到了一个范围不足的问题。DB2范围扩展到select查询中的所有表;而雪花仅限于子句中的表:
在DB2中有效:
select * from
t_1
join
table (values
(t_1.c1, ‘foo’)
,(t_1.c1, ‘bar’)
) as t_2 (c1, c2)
on t_1.c5 = t_2.c2在雪花中无效(语法略有不同-删除“表”):
select * from
t_1
join
(values
(t_1.c1, ‘foo’)
,(t_1.c1, ‘bar’)
) as t_2 (c1, c2)
on t_1.c5 = t_2.c2这会引发一个错误,即"...t_1是未定义的“。
,有人知道雪花的等效能力吗?
对于某些上下文:这个构造位于我们的业务的一个嵌入过程的后面,而对于返工来说,这意味着大量的投资。
它构成了动态ETL查询的基础,该查询被传递到ADF管道中。有一个前端将组件部署到这个查询中--这个可部署的部分需要尽可能地保持简单。它相当于"(t_1.c1,‘foo’)“行,所以理想情况下,任何解决方案都应该保持此部分不变。
编辑:
为了其他的背景..。
在上面的示例中,我们有一个占位符,它标识来自前端的新部署项的插入点,如下所示:
select * from
t_1
join
table (values
(t_1.c1, ‘foo’)
,(t_1.c1, ‘bar’)
/*client_X_placeholder*/
) as t_2 (c1, c2)
on t_1.c5 = t_2.c2
union
select * from
t_1
join
table (values
(t_1.c1, ‘foo’)
,(t_1.c1, ‘bar’)
,(t_1.c2, 'barfoo')
/*client_Y_placeholder*/
) as t_2 (c1, c2)
on t_1.c5 = t_2.c2我们正在提取一系列与客户端相关的度量,其中标签为t_2.c2,其结果是t2.c1。相对于现实世界,这仍然是高度简化的。我们需要一种简单的方法来用新的度量来更新占位符及其计算- t2.c1可以封装在一堆函数中和/或驻留在case语句中,等等。
发布于 2022-02-11 06:18:42
我不知道这是否适用于雪花,但如果要在雪花中引用t_2,则需要将其声明为t_1。Db2使用表作为横向(这同样有效)的同义词。所以你可以试着:
select *
from t_1
join LATERAL (
values (t_1.c1, ‘foo’)
, (t_1.c1, ‘bar’)
) as t_2 (c1, c2)
on t_1.c5 = t_2.c2在SQL99中引入了Db2,并得到了包括Db2在内的许多数据库管理系统的支持。
在Db2中,当从返回表的函数中选择时,通常使用表:
SELECT * FROM TABLE ( myfun() )这有点类似,所以我想这就是为什么表可以充当横向的同义词(只是猜测)。
我做了一些googling和横向描述,在文档中描述雪花:连接-横向
编辑:
显然,在加入派生表中的values子句时有一个限制。西门朝圣者的答案包含了对此的修复。
https://stackoverflow.com/questions/71074248
复制相似问题