Я знаю, что пространство имен не является правильным термином для этого, но оно передает то, что я пытаюсь понять. Возьмите этот запрос:
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 просто выполняет разделение массива и объединение?
@SergeyGeron извините, обновлено.
Когда вам нужно использовать массив в перекрестном соединении (или других типах) - у вас есть следующие варианты
from tableA cross join unnest(array) as element
from tableA, unnest(array) as element
-- здесь запятая на самом деле является сокращением для перекрестного соединения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)?
Первый запрос выбирает само поле 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
?
ага, похоже это
Скриншоты выглядят одинаково...