“t(sites)”对于 presto 查询意味着什么?

Che*_*rry 4 arrays amazon-web-services presto amazon-athena lateral-join

以下是 aws 网站的片段:

WITH dataset AS (
  SELECT ARRAY[
    CAST(
      ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('news.cnn.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    ),
    CAST(
      ROW('netflix.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
    )
  ] as items
)
SELECT sites.hostname, sites.flaggedActivity.isNew
FROM dataset, UNNEST(items) t(sites)
WHERE sites.flaggedActivity.isNew = true;
Run Code Online (Sandbox Code Playgroud)

它有效!但什么t(sites)意思呢?当我尝试使用真实表而不是dataset我收到错误时Table 'site' not found

它看起来很奇怪 - 就像用关键字调用的函数一样UNNEST。有人能解释一下这是什么吗?

GMB*_*GMB 7

FROM dataset, UNNEST(items) t(sites)
Run Code Online (Sandbox Code Playgroud)

UNNEST()是一个集合返回函数:它生成一系列行,其中一列保存原始数组中的值。

这组行也称为派生表。这t是派生表的别名,也是site该派生表中(唯一)列的名称。

如果我们加上关键字可能会更容易理解AS

FROM dataset, UNNEST(items) AS t(sites)
Run Code Online (Sandbox Code Playgroud)