什么是可以在 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 可能是:

  1. 内联视图(在语句中定义的视图,仅在语句持续期间有效
  2. 一个子查询select * from d, lateral (select * from e where e.id = d.id)
  3. 一个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,可能会更容易理解。或许不是,它会增加混乱。

就像自然语言一样,您可以用多种方式来表达同一件事,但有些方式更容易理解。