Я пытаюсь понять тонкости неявного 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
Очевидно, что f1
в моих первых 2 предложениях select не относятся к одному и тому же.В:
SELECT
f1
FROM
arry
INNER JOIN
arry.f1
f1
в SELECT
относится к косвенно необъявленному arry.f1
.
Во втором случае, где I-псевдоним,
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
?
Это определенно отбросило меня, когда я увидел результаты.Я не вижу нигде в документации, где говорится о том, как именование и область видимости работают с неявным unnesting.