什么是可以在 Snowflake 中与 LATERAL 一起使用的内联视图(不是子查询,不是 table 函数)?
What is inline-view that can be used with LATERAL in Snowflake (not subquery, not table function)?
Snowflake documentation for Lateral Join 在
中提到
SELECT ... FROM <left_hand_table_expression>, LATERAL ( <in_line_view> )
in_line_view
可能是:
- 内联视图(在语句中定义的视图,仅在语句持续期间有效
- 一个子查询
select * from d, lateral (select * from e where e.id = d.id)
- 一个table函数(可以是FLATTEN等内置函数,也可以是用户定义的table函数(UDFT))
select * from e, lateral flatten(input => e.x)
我已经在LATERAL(...)
中使用了子查询和table函数,但我想知道另一种<in_line_view>
是什么(以及它与子查询的不同之处)。
他们的语言肯定有点混乱。真的只是从该列表中删除 1.
项目符号,它会更有意义。据我所知,"inline view" 和 "subquery" 之间的唯一区别是内联视图是较大查询的特定部分中的子查询。在这种情况下,在 lateral
子句中。他们甚至在该页面底部的示例中指定 FLATTEN 是内联视图。
This example shows how a lateral join can use the in-line view returned by FLATTEN:
select * from table1, lateral flatten(...);
希望进一步澄清,例如,FROM
子句中的子查询必须 运行 一次,然后加入、选择等,因此由优化器处理以类似于视图的方式。当您这样做时,它可以称为内联视图。但是,SELECT
子句中的子查询对于每条记录必须是 运行,因此执行计划不会以相同的方式处理它。
一个经验法则是,如果查询解析器强制您给子查询一个别名,它可能是 "inline view".
一种重要的内联视图类型是通用 Table 表达式或 CTE。
WITH my_in_line_view AS (SELECT ...)
SELECT * FROM my_in_line_view
使用所有这些不同的方式来表达类似查询的一个要点是代码清晰。
SQL 优化器可能会将所有版本视为相似,但在阅读您的代码时,如果您使用经过深思熟虑的 CTE,可能会更容易理解。或许不是,它会增加混乱。
就像自然语言一样,您可以用多种方式来表达同一件事,但有些方式更容易理解。
Snowflake documentation for Lateral Join 在
中提到SELECT ... FROM <left_hand_table_expression>, LATERAL ( <in_line_view> )
in_line_view
可能是:
- 内联视图(在语句中定义的视图,仅在语句持续期间有效
- 一个子查询
select * from d, lateral (select * from e where e.id = d.id)
- 一个table函数(可以是FLATTEN等内置函数,也可以是用户定义的table函数(UDFT))
select * from e, lateral flatten(input => e.x)
我已经在LATERAL(...)
中使用了子查询和table函数,但我想知道另一种<in_line_view>
是什么(以及它与子查询的不同之处)。
他们的语言肯定有点混乱。真的只是从该列表中删除 1.
项目符号,它会更有意义。据我所知,"inline view" 和 "subquery" 之间的唯一区别是内联视图是较大查询的特定部分中的子查询。在这种情况下,在 lateral
子句中。他们甚至在该页面底部的示例中指定 FLATTEN 是内联视图。
This example shows how a lateral join can use the in-line view returned by FLATTEN:
select * from table1, lateral flatten(...);
希望进一步澄清,例如,FROM
子句中的子查询必须 运行 一次,然后加入、选择等,因此由优化器处理以类似于视图的方式。当您这样做时,它可以称为内联视图。但是,SELECT
子句中的子查询对于每条记录必须是 运行,因此执行计划不会以相同的方式处理它。
一个经验法则是,如果查询解析器强制您给子查询一个别名,它可能是 "inline view".
一种重要的内联视图类型是通用 Table 表达式或 CTE。
WITH my_in_line_view AS (SELECT ...)
SELECT * FROM my_in_line_view
使用所有这些不同的方式来表达类似查询的一个要点是代码清晰。
SQL 优化器可能会将所有版本视为相似,但在阅读您的代码时,如果您使用经过深思熟虑的 CTE,可能会更容易理解。或许不是,它会增加混乱。
就像自然语言一样,您可以用多种方式来表达同一件事,但有些方式更容易理解。