如何解决为什么这个 Snowflake 查询不需要 LATERAL 关键字就可以工作?
我在雪花中有这个视图:
create or replace view foo as
select $1 as id_foo,$2 as sales
from (values (1,100),(2,200),(3,300));
还有这个user-defined table function:
CREATE OR REPLACE FUNCTION build_aux_table ( restriction number )
RETURNS TABLE ( aux_id number )
AS 'select $1 as aux_id from (VALUES (1),(2),(3)) where aux_id = restriction';
以下查询有效,并返回 3 行:
select id_foo,baz.aux_id
from foo
cross join table(build_aux_table(foo.id_foo)) baz;
但是,我没想到查询会编译,因为我们要加入的 UDTF 生成的表依赖于第一个表中的列。我的理解是,这种表内依赖关系需要一个 LATERAL 连接,如下所示(也适用):
select id_foo,baz.aux_id
from foo
cross join lateral build_aux_table(foo.id_foo) baz;
为什么没有 LATERAL 的查询可以工作?
解决方法
Snowflake 手册中没有明确提及(至少在您链接到的地方),但标准行为是 LATERAL
关键字对于函数是可选的。引用 PostgreSQL manual:
出现在 FROM
中的表函数也可以在键前面
词LATERAL
,但对于函数,关键字是可选的;这
函数的参数可以包含对由提供的列的引用
在任何情况下都位于 FROM
项之前。
大胆强调我的。
也有道理,恕我直言。如果不是从其他表中,函数将从何处获取其参数?将仅限于没有横向参考的手动输入。
,代码:
select id_foo,baz.aux_id
from foo
cross join table(build_aux_table(foo.id_foo)) baz;
基本上是一样的:
select id_foo,baz.aux_id
from foo,table(build_aux_table(foo.id_foo)) baz;
它在文档中描述:
Calling JavaScript UDTFs in Queries
这个简单的例子展示了如何调用 UDTF。此示例传递文字值。
SELECT * FROM TABLE(js_udtf(10.0::FLOAT,20.0::FLOAT));
此示例调用 UDTF 并从另一个表中传递值。 在此示例中,名为 js_udtf 的 UDTF 为名为 tab1 的表中的每一行调用一次。 每次调用该函数时,都会传递来自当前行的 c1 和 c2 列的值。
SELECT * FROM tab1,TABLE(js_udtf(tab1.c1,tab1.c2)) ;
Sample UDTFs - Examples with joins
在与另一个表的连接中使用 UDTF; 请注意,表中的连接列作为参数传递给函数。
select *
from favorite_years y join table(favorite_colors(y.year)) c;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。