2016-12-14 5 views
0

(Edit: В случае, если кто хотел бы попробовать, это URL SQL Скрипки: http://sqlfiddle.com/#!9/39c72c/1)Как обновить (слияние), когда аналогичный пункт существует в таблице

Пусть у меня есть таблица A, которая выглядит, как показано ниже:

col_1 col_2 cnt_1 mapped_val 
    A1  B1  10  mapped_A1 
    A2  B2   5  mapped_A2 
    A3  B3   0  mapped_A3 
.... 

у меня также есть таблица B, которая выглядит, как показано ниже:

col_1 col_2 cnt_1 mapped_val 
    A1  B1  20  update_to_this 
    A2  B2   5  do_not_update_to_this 
    D1  D2   5  mapped_D1 
    E3  E3   0  mapped_E3 
.... 

для каждого из строки в таблице B, я бы хотел бы посмотреть его в таблице A с использованием col_1 и col_2 И если cnt_1 таблицы A меньше, чем у стола B, то я хотел бы обновить cnt_1 и mapped_val записей в таблице A с тем из таблицы B. Для тех, которые из таблицы B не совпадают, я хотел бы добавить их в таблицу A. В результате, применяя такую ​​операцию в таблице A будет:

col_1 col_2 cnt_1 mapped_val 
    A1  B1  20  update_to_this 
    A2  B2   5  mapped_A2 
    A3  B3   0  mapped_A3 
    D1  D2   5  mapped_D1 
    E3  E3   0  mapped_E3 
.... 

Я думаю MERGE INTO (см мой лучший попробовать ниже) приближается к реализации этого, но я не уверен, как реализовать логику сравнения в рамках запроса MERGE INTO.

MERGE INTO 
    A AS a 
USING 
    B AS b 
ON 
    a.col_1 = b.col_1 
    AND 
    a.col_2 = b.col_2 
WHEN MATCHED -- AND a.cnt_1 < b.cnt_1? 
    THEN UPDATE 
     SET 
      a.cnt_1 = b.cnt_1, 
      a.mapped_val = b.mapped_val 
WHEN NOT MATCHED -- AND a.cnt_1 < b.cnt_1? 
    THEN INSERT 
     (col_1, col_2, cnt_1, mapped_val) 
    VALUES 
     (b.col_1, b.col_2, b.cnt_1, b.mapped_val); 

Заранее благодарим за ваши ответы/предложения!

ответ

0

Я не 100% уверен, что синтаксис Vertica, но я считаю, что это должно просто работать:

MERGE INTO 
    A AS a 
USING 
    B AS b 
ON 
    a.col_1 = b.col_1 
    AND 
    a.col_2 = b.col_2 
    AND 
    a.cnt_1 < b.cnt_1 
WHEN MATCHED 
    THEN UPDATE 
     SET 
      a.cnt_1 = b.cnt_1, 
      a.mapped_val = b.mapped_val 
WHEN NOT MATCHED 
    THEN INSERT 
     (col_1, col_2, cnt_1, mapped_val) 
    VALUES 
     (b.col_1, b.col_2, b.cnt_1, b.mapped_val); 

Обратите внимание, что если вы используете WHEN MATCHED AND подход, кортежи, которые соответствуют вашему ON предикат не будет претендовать на WHEN NOT MATCHED

+0

Благодарим вас за ответ. Я пробовал это, и это очень близко к тому, чего я хотел бы достичь. Единственным исключением является то, что 'A2 \t B2 строка do_not_update_this' в таблице' B' добавлена ​​в 'A' в результате. Я обновил свой вопрос с помощью ссылки на скрипт SQL в случае, если кто-то захочет нанести ему удар. Еще раз спасибо. – user1330974

+0

Ну, тогда я предполагаю, что ваш исходный запрос с 'WHEN MATCHED AND a.cnt1

+0

Я пробовал только ради этого, но я не думаю, что 'WHEN MATCHED AND a.cnt1 user1330974

 Смежные вопросы

  • Нет связанных вопросов^_^