支持的动态表查询

动态表支持标准 SQL 表达式和 Snowflake 支持的函数,包括数学运算、字符串函数、日期函数等。本主题介绍动态表在增量和完全刷新模式下支持的表达式、构造、函数、运算符和子句。

如果查询使用增量刷新不支持的表达式、关键字、运算符或子句,则自动刷新流程将改为使用完全刷新,这可能会产生额外费用

支持的数据类型

动态表支持所有 Snowflake SQL 数据类型,用于增量和完全刷新,但以下类型除外:

  • 结构化数据类型。

  • 地理空间数据类型(仅完全刷新)。

增量和完全刷新模式下支持的查询

关键字

增量刷新模式

完全刷新模式

DISTINCT

支持

支持

外部函数

不支持

不支持

FROM

源表、视图、Snowflake 管理的 Apache Iceberg™ 表和其他动态表。

不支持 FROM 子句(例如 WHERE EXISTS)外部的子查询。

支持

GROUP BY

支持

支持

CROSS JOIN

支持。您可以在联接中指定任意数量的表,联接中所有表的更新都会反映在查询结果中。

支持

INNER JOIN

支持。您可以在联接中指定任意数量的表,联接中所有表的更新都会反映在查询结果中。

支持

LATERAL JOIN

不支持。但是,您可以将 LATERAL 与 FLATTEN() 结合使用。例如:

CREATE TABLE persons
 AS
  SELECT column1 AS id, parse_json(column2) AS entity
  FROM values
   (12712555,
   '{ name:  { first: "John", last: "Smith"},
     contact: [
     { business:[
       { type: "phone", content:"555-1234" },
       { type: "email", content:"j.smith@example.com" } ] } ] }'),
   (98127771,
    '{ name:  { first: "Jane", last: "Doe"},
     contact: [
     { business:[
       { type: "phone", content:"555-1236" },
       { type: "email", content:"j.doe@example.com" } ] } ] }');
Copy
CREATE DYNAMIC TABLE my_dynamic_table
 TARGET_LAG = DOWNSTREAM
 WAREHOUSE = mywh
 AS
  SELECT p.id, f.value, f.path
  FROM persons p,
  LATERAL FLATTEN(input => p.entity) f;
Copy

使用横向展平和增量刷新时,请注意以下行为:

  • 不支持从横向展平联接中选择展平 SEQ 列。

  • 使用 AUTO 参数时,Snowflake 通常会为具有横向展平联接的查询选择增量刷新,除非受其他限制阻止。

支持。

OUTER-EQUI JOIN。

支持。您可以在联接中指定任意数量的表,联接中所有表的更新都会反映在查询结果中。

支持

[{LEFT | RIGHT | FULL }] OUTER JOIN

不支持以下内容:

  • 外部联接,联接双方位于同一表。

  • 外部联接,联接双方都具有 GROUP BY 子句的子查询。

  • 带有非相等谓词的外部联接。

否则,您可以在外部联接中指定任意数量的表,联接中所有表的更新都会反映在查询结果中。

支持

ML 或 LLM 函数

Supported in the SELECT clause.

支持

PIVOTUNPIVOT

不支持

不支持

SAMPLE / TABLESAMPLE

不支持

不支持

标量汇总

支持

支持

SELECT

包括使用确定性内置函数和 不可变 用户定义函数 的表达式。

支持

:doc:`/sql-reference/operators-query`(UNION、MINUS、EXCEPT、INTERSECT)

不支持,但 UNION 除外。在增量刷新中,UNION 集合运算符的工作原理类似于 UNION ALL 和 SELECT DISTINCT 运算符的组合。

支持

序列

不支持

不支持

所有 子查询运算符

不支持

支持

UNION ALL

支持

支持

用户定义函数 (UDFs)

支持,但以下限制除外:

  • 不支持以 Python、Java、Scala 或 Javascript 编写、用于指定 VOLATILE 参数的 UDFs。

  • 不支持以 SQL 编写、包含子查询的 UDFs(例如,SELECT 语句)。

  • 当使用增量刷新的动态表使用 IMMUTABLE UDF 时,替换该函数会导致刷新失败。

  • 不支持从外部暂存区导入 UDFs。

支持

用户定义的表函数 (UDTFs)

支持,但以下限制除外:

  • 不支持以 SQL 编写的 UDTFs。

  • 从 UDTFs 读取的 SELECT 块必须明确指定列,并且不能使用 *

支持

WHERE/HAVING/QUALIFY

支持具有在 SELECT 中有效的相同表达式的筛选器。

支持具有 CURRENT_TIMESTAMP、CURRENT_TIME 和 CURRENT_DATE 函数及其别名的筛选器。

支持。

支持具有 CURRENT_TIMESTAMP、CURRENT_TIME 和 CURRENT_DATE 函数及其别名的筛选器。

窗口函数

支持,但以下限制除外:

  • 不支持使用带有滑动窗口框架的窗口函数 PERCENT_RANK、DENSE_RANK、RANK。

  • 不支持使用 ANY_VALUE,因为它是一个非确定性函数。

支持

WITH

支持 公用表表达式 (CTEs) 在子查询中使用支持增量刷新的功能。

不支持 WITH RECURSIVE。

支持

在增量和完全刷新模式下支持的非确定性函数

非确定性函数

增量刷新模式

完全刷新模式

ANY_VALUE

不支持

不支持

CLASSIFY_TEXT (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

COMPLETE (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

CURRENT_ACCOUNT

不支持

支持

:doc:`/sql-reference/functions/current_date`(以及别名)

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

CURRENT_REGION

不支持

支持

CURRENT_ROLE

不支持

支持

:doc:`/sql-reference/functions/current_time`(以及别名)

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

:doc:`/sql-reference/functions/current_timestamp`(以及别名)

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

仅支持作为 WHERE/HAVING/QUALIFY 子句的一部分。

依赖 CURRENT_USER 的函数。

不支持。动态表刷新由一个特殊 SYSTEM 用户作为其所有者角色。

不支持。动态表刷新由一个特殊 SYSTEM 用户作为其所有者角色。

CURRENT_WAREHOUSE

不支持

支持

DENSE_RANK

支持

支持

EMBED_TEXT_768 (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

EMBED_TEXT_1024 (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

EXTRACT_ANSWER (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

FINETUNE (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

FIRST_VALUE

支持

支持

LAST_VALUE

支持

支持

NTH_VALUE

支持

支持

RANK

支持

支持

ROW_NUMBER

支持

支持

SENTIMENT (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

序列函数 (例如 SEQ1SEQ2

不支持

支持

TRANSLATE (SNOWFLAKE.CORTEX)

Supported in the SELECT clause

支持

VOLATILE 用户定义的函数

不支持

支持

Supported Snowflake Cortex AISQL functions

You can use Snowflake Cortex AISQL(包括 LLM 功能) in the SELECT clause for dynamic tables in incremental refresh mode. The same availability restrictions as described in AISQL 函数 apply.

Cortex AISQL lets you add AI-powered insights directly to your dynamic tables, automatically analyzing data as it updates. For example, it can classify customer reviews, support tickets, or survey responses as positive/negative or assign categories.

In the following example, review_sentiment uses AI_FILTER to evaluate each review with an LLM. Cortex AISQL combines the prompt The reviewer enjoyed the restaurant with the actual review text. The output column enjoyed is the classification generated using Cortex AISQL based on the prompt, indicating whether the reviewer enjoyed the restaurant.

CREATE OR REPLACE TABLE reviews AS
  SELECT 'Wow... Loved this place.' AS review
  UNION ALL
  SELECT 'The pizza is not good.' AS review;

CREATE OR REPLACE DYNAMIC TABLE review_sentiment
  TARGET_LAG = DOWNSTREAM
  WAREHOUSE = mywh
  REFRESH_MODE = INCREMENTAL
  AS
    SELECT review, AI_FILTER(CONCAT('The reviewer enjoyed the restaurant', review), {'model': 'llama3.1-70b'}) AS enjoyed FROM reviews;
Copy
语言: 中文