我试图了解隐式UNNEST
的优点。最特别的是,如果您不对未嵌套的字段进行别名,将如何对其进行引用。
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
加上别名:
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
尝试以下操作可以了解正在发生的事情:
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
?
当我看到结果时,这肯定使我失望。我在文档中找不到任何地方可以说明命名和作用域如何与隐式取消嵌套一起工作。
答案 0 :(得分:2)
我不明白为什么可以将f1假定为示例1中的值:
我的几分钱...
尽管如此,我仍在大量使用该功能来简化/简化代码-我不确定它是“设计功能”还是“偶然功能”
因此,当您使用JOIN arry.f1
时,它被视为一个表(arry表的子表)–我认为是由于这里的模式dataset.table
。这样,f1数组中的每个元素都被视为单独行中的值(在父行级别上仍应用JOIN)