Общие сведения о таблицах, на которые ссылается перекрестное соединение массива BigQuery

Я знаю, что пространство имен не является правильным термином для этого, но оно передает то, что я пытаюсь понять. Возьмите этот запрос:

WITH Movies AS (
  SELECT 'Titanic' AS title,
  1997 AS year, 
  ['Drama',' Romance'] AS Genres
)
SELECT title, year, Movies.Genres FROM Movies, Movies.Genres where Genres='Drama'

Но тогда использование Movies.Genres вместо Genres дает другой результат:

WITH Movies AS (
  SELECT 'Titanic' AS title,
  1997 AS year, 
  ['Drama',' Romance'] AS Genres
)
SELECT title, year,Genres FROM Movies, Movies.Genres where Genres='Drama'

Почему это происходит? Кроме того, является ли это стандартным (ISO) SQL или BigQuery просто выполняет разделение массива и объединение?

Скриншоты выглядят одинаково...

Sergey Geron 11.12.2020 06:24

@SergeyGeron извините, обновлено.

David542 11.12.2020 06:29
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вам нужно использовать массив в перекрестном соединении (или других типах) - у вас есть следующие варианты

  1. from tableA cross join unnest(array) as element
  2. from tableA, unnest(array) as element -- здесь запятая на самом деле является сокращением для перекрестного соединения
  3. если массив является столбцом таблицы A, вы можете использовать еще один ярлык (теперь для не вложенности)
    from tableA, tableA.array as element

Преимущество использования UNNEST заключается в том, что вы можете определить OFFSET, как в приведенном ниже примере.

from tableA, unnest(array) as element with offset      

Наличие смещения чрезвычайно важно во многих случаях использования
В моей практике - я использую все вышеперечисленные варианты в зависимости от конкретного случая.

Теперь, что касается разницы в двух запросах:

Итак, первый запрос

SELECT title, year, Movies.Genres 
FROM Movies, Movies.Genres 
where Genres='Drama'    

эквивалентен приведенному ниже (обратите внимание на псевдоним)

SELECT title, year, Movies.Genres 
FROM Movies, Movies.Genres as Genres
where Genres='Drama' 

Genres в where Genres='Drama' относится к элементу из неявно не вложенных Movies.Genres, поэтому одним из элементов является Drama, который возвращает 1 элемент из двух
И теперь хитрость заключается в том, что в операторе select вы явно вызываете Movies.Genres, который является исходным массивом в этой строке, так что это объясняет вывод

Вы можете попробовать ниже, чтобы подтвердить приведенное выше объяснение

SELECT title, year, Movies.Genres
FROM Movies, Movies.Genres as Genres
where Genres in ('Drama', ' Romance')

для приведенного выше вывода будет

Хотя выше объяснен вывод для первого запроса, я надеюсь, что теперь понятно, почему второй запрос возвращает фактический жанр (драму) вместо массива.

Надеюсь, это помогло понять различия :о)

спасибо, это здорово. Является ли этот синтаксис специфичным для BigQuery или вы знаете какие-либо другие СУБД, которые имеют что-то подобное (postgres, sqlserver, oracle)?

David542 11.12.2020 06:35

Первый запрос выбирает само поле Genres из Movies таблицы, поэтому мы видим 2 строки, потому что оно имеет 2 значения. Во втором запросе Genres теперь считается строкой из не вложенных Movies.Genres. Чтобы устранить эту неоднозначность, вероятно, имеет смысл использовать as:

SELECT title, year, G FROM Movies, Movies.Genres as G where G = 'Drama'

Ясно, поэтому BQ автоматически присваивает объединенной таблице псевдонимы, например: Movies.Genres --> Movies.Genres as Genres ?

David542 11.12.2020 06:43

ага, похоже это

Sergey Geron 11.12.2020 06:44

Другие вопросы по теме