У меня есть две таблицы в Google Big Query. Одна таблица представляет собой своего рода каталог продукции (1: 1), а вторая - информацию о продукте (1: n). По запросу я присоединяюсь к обоим. Но объединение не удается, поскольку столбец pid
и некоторые другие присутствуют в обеих таблицах.
#standardSQL
SELECT tbl1.*, tbl2.* FROM (
SELECT * FROM `my_project.my_dataset.my_table_1`
) AS tbl1
LEFT JOIN ( SELECT * FROM `my_project.my_dataset.my_table_2`) AS tbl2
ON tbl1.pid = tbl2.pid
WHERE tbl1.category LIKE '111002%'
Идея 1: Как выбрать *
без дублированных столбцов (которые я могу вставить вручную).
Идея 2: Как предоставить префикс влево / вправо для столбцов в объединении?
Любая помощь приветствуется.
Чтобы избежать дублирования pid
с обеих сторон соединения, используйте вместо этого предложение USING
:
#standardSQL
SELECT * FROM (
SELECT * FROM `my_project.my_dataset.my_table_1`
) AS tbl1
LEFT JOIN ( SELECT * FROM `my_project.my_dataset.my_table_2`) AS tbl2
USING(pid)
WHERE tbl1.category LIKE '111002%'
Чтобы префикс имен столбцов с обеих сторон объединения, используйте ссылку на таблицы в списке выбора вместо применения к ним .*
:
#standardSQL
SELECT tbl1, tbl2 FROM (
SELECT * FROM `my_project.my_dataset.my_table_1`
) AS tbl1
LEFT JOIN ( SELECT * FROM `my_project.my_dataset.my_table_2`) AS tbl2
USING(pid)
WHERE tbl1.category LIKE '111002%'
Столбцы, полученные в результате запроса, будут tbl1
и tbl2
, которые представляют собой STRUCT, содержащие столбцы из каждой из этих таблиц в качестве полей.
BigQuery «выталкивает» фильтр, когда он находится за пределами соединения (если вы используете стандартный SQL). Я обновил первый пример, так как думаю, что он будет работать, если вы будете использовать *
вместо tbl1.*, tbl2.*
.
Спасибо! Второе утверждение сработало, первое - нет. Может быть, потому что таблица 1 на самом деле представляет собой представление? Еще один вопрос: следует ли поместить WHERE в SELECT в первой таблице, поскольку эта таблица является меньшей? Или Big Query все равно оптимизирует оператор?