Вопрос о неявном UNNEST и эффектах наложения псевдонимов или нет, в поле необязательного массива - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь понять тонкости неявного 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.

1 Ответ

0 голосов
/ 06 февраля 2019

Я не понимаю, почему f1 можно считать тем, что есть в примере 1:

Мои несколько центов ...

Дажетем не менее, я часто использую эту функцию для упрощения / оптимизации кода - я не уверен, является ли она «разработанной функцией» или просто «возможностью случайно»

Когда вы используете JOIN arry.f1, он обрабатывается как таблица (подстоль таблицы arry) - я думаю, что здесь из-за паттерна dataset.table.Таким образом, каждый элемент массива f1 рассматривается как значение в отдельной строке (при этом на уровне родительской строки применяется неподвижное JOIN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...