表引用 (table reference)

适用于:Databricks SQL check marked yes Databricks Runtime

表引用是 SQL 中的中间结果表。 它可以从其他运算符(例如函数、联接或子查询)派生、直接引用基表,或构造为内联表。

语法

table_reference
  { table_name [ TABLESAMPLE clause ] [ table_alias ] |
    { STREAM table_name [ table_alias ] | STREAM ( table_name ) [ table_alias ] } |
    view_name [ table_alias ] |
    JOIN clause |
    PIVOT clause |
    UNPIVOT clause |
    [ STREAM ] table_valued_function [ table_alias ] |
    [ LATERAL ] table_valued_function [ table_alias ] |
    VALUES clause |
    [ LATERAL ] ( query ) [ TABLESAMPLE clause ] [ table_alias ] }

参数

  • table_name

    标识一个可能包含时态规范的表。 有关详细信息,请参阅使用 Delta Lake 表历史记录

    如果找不到表,Azure Databricks 会引发 TABLE_OR_VIEW_NOT_FOUND 错误。

    有关名称解析的详细信息,请参阅列、字段、参数和变量解析

  • view_name

    标识视图或通用表表达式 (CTE)。 如果找不到视图,Azure Databricks 会引发 TABLE_OR_VIEW_NOT_FOUND 错误。

    有关名称解析的详细信息,请参阅列、字段、参数和变量解析

  • STREAM

    返回表或表值函数作为流式处理源。 与 STREAM 关键字一起使用时,不能为表提供时态规范。 流式处理源最常用于流式处理表的定义中。

  • JOIN

    使用联接合并两个或多个关系。

  • PIVOT

    适用于:check marked yesDatabricks SQL check marked yes Databricks Runtime 12.0 及更高版本。

    用于数据透视;可根据特定的列值获取聚合值。

    在 Databricks Runtime 12.0 之前,PIVOT 仅限于 FROM 子句后面的 SELECT

  • UNPIVOT

    适用于:check marked yesDatabricks SQL check marked yes Databricks Runtime 12.0 及更高版本。

    用于数据透视;可将多个列组拆分为行。

  • [LATERAL]table_valued_function_invocation

    调用表值函数。 若要引用同一 table_reference 子句中前面 FROM 所显示的列,必须指定 LATERAL

  • 定义内联表。

  • [LATERAL] ( query )

    使用查询计算表引用。 以 LATERAL 为前缀的查询可能会引用同一 FROM 子句中前面的 table_reference 公开的列。 此类构造称为相关查询或依赖查询。

    从 Databricks Runtime 9.0 开始支持 LATERAL

  • TABLESAMPLE

    (可选)通过只对部分行进行采样来减小结果集的大小。

  • table_alias

    (可选)为 table_reference 指定一个标签。 如果 table_alias 包含 column_identifier,其数字必须与 table_reference 中的列数匹配。

选择 Delta 表

除标准 SELECT 选项外,Delta 表还支持本部分中介绍的按时间顺序查看选项。 有关详细信息,请参阅使用 Delta Lake 表历史记录

AS OF 语法

table_identifier TIMESTAMP AS OF timestamp_expression

table_identifier VERSION AS OF version
  • timestamp_expression 可以是下列项中的任意一项:
    • '2018-10-18T22:15:12.013Z',即可以强制转换为时间戳的字符串
    • cast('2018-10-18 13:36:32 CEST' as timestamp)
    • '2018-10-18',即日期字符串
    • current_timestamp() - interval 12 hours
    • date_sub(current_date(), 1)
    • 本身就是时间戳或可强制转换为时间戳的任何其他表达式
  • version 是可以从 DESCRIBE HISTORY table_spec 的输出中获取的 long 值。

timestamp_expressionversion 都不能是子查询。

示例

> SELECT * FROM events TIMESTAMP AS OF '2018-10-18T22:15:12.013Z'

> SELECT * FROM delta.`/mnt/delta/events` VERSION AS OF 123

@ 语法

使用 @ 语法来指定时间戳或版本。 时间戳必须采用 yyyyMMddHHmmssSSS 格式。 你可以通过在版本前附加一个 v@ 后指定版本。 例如,若要查询表 events 的版本 123,请指定 events@v123

示例

> SELECT * FROM events@20190101000000000

> SELECT * FROM events@v123

示例

-- select all referencable columns from all tables
> SELECT * FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
  1   2   3   4

-- select all referencable columns from one table
> SELECT t2.* FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
  3   4

-- select all referencable columns from all tables except t2.c4
> SELECT * EXCEPT(c4) FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
  1   2   3

-- select all referencable columns from a table, except a nested field.
> SELECT * EXCEPT(c2.b) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
  1  { "a" : 2 }

-- Removing all fields results in an empty struct
> SELECT * EXCEPT(c2.b, c2.a) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
  1  { }

-- Overlapping names result in an error
> SELECT * EXCEPT(c2, c2.a) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
  Error: EXCEPT_OVERLAPPING_COLUMNS