Оператор 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 в другом месте этого документа.
В вашем случае, похоже, вы используете PK как 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
.