Эквивалент оператора слияния в BigQuery
Выполняю миграцию с тераданных на большой запрос. Я столкнулся с оператором слияния, содержащим ЗНАЧЕНИЯ в предложении USING.
MERGE INTO department DL
USING VALUES
(
2,'ABC'
) AS V
(Run_Id, Country)
ON DL.department_id = V.Run_Id
WHEN MATCHED THEN
UPDATE SET
department_description = V.country
WHEN NOT MATCHED THEN
INSERT
(
V.Run_Id
, V.Country
curr
);
Может ли кто-нибудь помочь мне найти, что было бы эквивалентом BigQuery.
1 ответ
Оператор MERGE используется, когда вы хотите обновитьtarget table
используя source table
с одним или несколькими первичными ключами (PK).
Согласно документации, различия между MERGE Teradata и BigQuery заключаются в следующем:
Операция MERGE в Teradata ограничена сопоставлением первичных ключей в одном процессоре модуля доступа (AMP). Напротив, BigQuery не имеет ограничений по размеру или столбцу для операций MERGE, поэтому использование MERGE - полезная оптимизация. Однако, если MERGE - это в первую очередь большое удаление, см. Оптимизацию для DELETE в другом месте в этом документе.
Сценарии DML в BigQuery имеют немного другую семантику согласованности, чем эквивалентные операторы в Teradata. Например, таблицы SET Teradata в режиме сеанса могут игнорировать дубликаты во время операции MERGE. Обзор обработки таблиц MULTISET и SET, изоляции моментальных снимков и обработки сеансов и транзакций см. В разделе CREATE INDEX в другом месте этого документа.
В вашем случае кажется, что вы используете ПК какDL.department_id
а также V.Run_Id
. Хотя внутри вашего синтаксиса внутри предложения USING вы должны указывать целевую таблицу, а не только ее поля. Ниже приведен синтаксис, ссылка:
MERGE target_name [[AS] alias]
USING source_name
ON merge_condition
#WHEN MATCHED
#WHEN NOT MATCHED
Следовательно, в вашем случае синтаксис будет таким:
MERGE dataset.department DL
USING (SELECT * FROM `project_id.dataset.source_table`) V
ON DL.department_id = V.Run_Id
WHEN MATCHED THEN
UPDATE SET DL.department_description = V.country
WHEN NOT MATCHED
#first specify the name of the columns in your then the values to insert
INSERT(colum1, column2, column3) VALUES(V.Run_Id, V.Country, V.curr)
Обратите внимание, что внутри INSERT
предложение вы сначала указываете столбцы, в которые будут добавлены данные, а затем внутри VALUES
значения для вставки, вы можете указать значения явно или назвать столбцы из вашего source_table
с данными, которые нужно добавить. Хочу отметить, что считалcurr
как столбец из исходной таблицы. Кроме того, вы не указали исходную таблицу, а только некоторые ее поля.
Для дальнейшего пояснения ниже приведен еще один пример.
MERGE `dataset.target_table` T
USING (SELECT "New value" as value, "1" as ID) S
ON T.ID = S.ID
WHEN MATCHED THEN
UPDATE SET T.value_column = S.value
WHEN NOT MATCHED THEN
INSERT(value_column, id) VALUES("Value added", s.ID)
Опять же, обратите внимание на INSERT
предложение, сначала описываются столбцы из целевой таблицы, затем значения, которые будут вставлены в таблицу WHEN NOT MATCHED
.