Как обновить (объединить), когда подобный элемент существует в таблице
(Изменить. Если кто-то захочет попробовать, это 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