有关隐式UNNEST以及是否对未嵌套的数组字段使用别名的影响的问题

时间:2019-02-05 21:07:35

标签: google-bigquery

我试图了解隐式UNNEST的优点。最特别的是,如果您不对未嵌套的字段进行别名,将如何对其进行引用。

示例1

WITH
  arry AS (
  SELECT
    ['foo','bar'] AS f1
  UNION ALL
  SELECT
    ['a', 'b'] AS f1)

SELECT
  f1
FROM
  arry
CROSS JOIN
  arry.f1

按预期返回:

ROW         f1
1           foo
2           bar
3           a
4           b

但是,如果您为arry.f1加上别名:

示例2

WITH
  arry AS (
  SELECT
    ['foo','bar'] AS f1
  UNION ALL
  SELECT
    ['a', 'b'] AS f1)

SELECT
  f1
FROM
  arry
CROSS JOIN
  arry.f1 AS alias

您回来了:

ROW         f1
1           foo
            bar
2           foo
            bar
3           a
            b
4           a
            b

尝试以下操作可以了解正在发生的事情:

示例3

WITH
  arry AS (
  SELECT
    ['foo','bar'] AS f1
  UNION ALL
  SELECT
    ['a', 'b'] AS f1)

SELECT
  f1,  
  arry.f1 as arry_f1,
  alias
FROM
  arry
INNER JOIN
  arry.f1 AS alias

您回来了:

ROW    f1     arry_f1   alias
1      foo    foo       foo
       bar    bar
2      foo    foo       bar
       bar    bar
3      a      a         a
       b      b
4      a      a         b
       b      b

很显然,我的前2个select子句中的f1并不是指同一件事。在:

SELECT
  f1
FROM
  arry
INNER JOIN
  arry.f1
f1中的

SELECT指的是隐式未嵌套的arry.f1

在第二种情况下,我别名

SELECT
  f1
FROM
  arry
INNER JOIN
  arry.f1 AS alias

f1引用f1表的数组字段arry,而alias引用alias.f1中未嵌套的SELECT字段,如下所示:第三个例子很清楚。

我不明白为什么可以假设f1是示例1中的样子:

SELECT
  f1
FROM
  arry
INNER JOIN
  arry.f1

它是否是模棱两可的,因为它可能指向f1(是数组)的字段arry或隐式未嵌套的arry.f1

当我看到结果时,这肯定使我失望。我在文档中找不到任何地方可以说明命名和作用域如何与隐式取消嵌套一起工作。

1 个答案:

答案 0 :(得分:2)

  

我不明白为什么可以将f1假定为示例1中的值:

我的几分钱...

尽管如此,我仍在大量使用该功能来简化/简化代码-我不确定它是“设计功能”还是“偶然功能”

因此,当您使用JOIN arry.f1时,它被视为一个表(arry表的子表)–我认为是由于这里的模式dataset.table。这样,f1数组中的每个元素都被视为单独行中的值(在父行级别上仍应用JOIN)