Как обновить (объединить), когда подобный элемент существует в таблице

(Изменить. Если кто-то захочет попробовать, это URL-адрес скрипты SQL: http://sqlfiddle.com/).

Предположим, у меня есть стол 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);

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

1 ответ

Я не уверен на 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

Другие вопросы по тегам