Эквивалент оператора слияния в BigQuery - PullRequest
0 голосов
/ 20 июня 2020

Выполняю миграцию с тераданных на большой запрос. Я столкнулся с оператором слияния, имеющим VALUES в предложении 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 Ответ

1 голос
/ 22 июня 2020

Оператор 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.

...