MERGE-INTO
Описание
Вставляет, обновляет и удаляет значения в таблице на основе значений из другой таблицы или подзапроса. Слияние полезно, если вторая таблица представляет собой журнал изменений, содержащий новые строки (для вставки), изменённые строки (для обновления) или помеченные строки (для удаления) в целевой таблице.
Команда поддерживает обработку следующих случаев:
- Совпадающие значения (для обновления и удаления).
- Несовпадающие значения (для вставки).
Целевая таблица для этой команды должна использовать модель UNIQUE KEY.
Синтаксис
MERGE INTO <target_table>
USING <source>
ON <join_expr>
{ matchedClause | notMatchedClause } [ ... ]
где
matchedClause ::=
WHEN MATCHED
[ AND <case_predicate> ]
THEN { UPDATE SET <col_name> = <expr> [ , <col_name> = <expr> ... ] | DELETE }
notMatchedClause ::=
WHEN NOT MATCHED
[ AND <case_predicate> ]
THEN INSERT [ ( <col_name> [ , ... ] ) ] VALUES ( <expr> [ , ... ] )
Параметры
<target_table>
Указывает таблицу, в которой выполняется слияние.
<source>
Указывает таблицу или подзапрос для соединения с целевой таблицей.
<join_expr>
Указывает выражение, по которому выполняется соединение целевой таблицы с источником.
matchedClause (для обновления или удаления)
WHEN MATCHED ... AND <case_predicate>
Задаёт необязательное выражение, при истинном значении которого выполняется действие для совпадающих строк.
По умолчанию: значение не задано (действие для совпадающих строк выполняется всегда)
WHEN MATCHED ... THEN { UPDATE SET ... | DELETE }
Указывает действие, выполняемое при совпадении значений.
SET col_name = expr [ , col_name = expr ... ]
Обновляет указанный столбец в целевой таблице, используя соответствующее выражение для нового значения столбца (выражение может ссылаться как на целевую таблицу, так и на источник).
В одном подпредложении SET можно указать несколько столбцов для обновления.
DELETE
Удаляет строки целевой таблицы, совпадающие со строками источника.
notMatchedClause (для вставки)
WHEN NOT MATCHED ... AND <case_predicate>
Задаёт необязательное выражение, при истинном значении которого выполняется действие для несовпадающих строк. По умолчанию: значение не задано (действие для несовпадающих строк выполняется всегда)
WHEN NOT MATCHED ... THEN INSERT [ ( col_name [ , ... ] ) ] VALUES ( expr [ , ... ] )
Указывает действие, выполняемое при отсутствии совпадения значений.
( col_name [ , ... ] )
Позволяет указать один или несколько столбцов целевой таблицы, в которые будут вставлены значения из источника. По умолчанию: значение не задано (значения вставляются во все столбцы целевой таблицы)
VALUES ( expr [ , ... ] )
Указывает соответствующие выражения для вставляемых значений столбцов (выражения должны ссылаться на источник).
Требования к управлению доступом
Пользователь, выполняющий эту команду SQL, должен иметь как минимум следующие привилегии:
| Привилегия | Объект | Описание |
|---|---|---|
| SELECT_PRIV | целевая таблица и источник | |
| LOAD_PRIV | целевая таблица |
Примечания по использованию
- Целевая таблица для этой команды должна использовать модель UNIQUE KEY.
- Один оператор MERGE может включать несколько предложений для совпадающих и несовпадающих строк (то есть WHEN MATCHED ... и WHEN NOT MATCHED ...).
- Любое предложение для совпадающих или несовпадающих строк, в котором отсутствует подпредложение AND (поведение по умолчанию), должно быть последним предложением своего типа в операторе (например, за предложением WHEN MATCHED ... не может следовать предложение WHEN MATCHED AND ...). В противном случае возникает недостижимая ветвь, что приводит к ошибке.
Поведение при появлении дубликатов после соединения
В настоящее время Doris не проверяет, возникают ли дубликаты строк при соединении. Если они возникают, поведение не определено.
Если после соединения к одной и той же строке целевой таблицы одновременно применяются несколько операций (например, обновление, удаление или вставка), поведение аналогично поведению оператора INSERT: если есть столбец Sequence, итоговые записанные данные определяются его значением; в противном случае произвольно записывается одна из строк.
Примеры
В следующем примере выполняется простая операция слияния: данные в целевой таблице обновляются с использованием значений из исходной таблицы. Сначала создайте две таблицы и загрузите в них данные:
CREATE TABLE `merge_into_source_table` (
`c1` int NULL,
`c2` varchar(255) NULL
) ENGINE=OLAP
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
CREATE TABLE `merge_into_target_base_table` (
`c1` int NULL,
`c2` varchar(255) NULL
) ENGINE=OLAP
UNIQUE KEY(`c1`)
DISTRIBUTED BY HASH(`c1`)
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
INSERT INTO merge_into_source_table VALUES (1, 12), (2, 22), (3, 33);
INSERT INTO merge_into_target_base_table VALUES (1, 1), (2, 10);
Выведите значения в таблицах:
SELECT * FROM merge_into_source_table;
+----+----+
| c1 | c2 |
+----+----+
| 1 | 12 |
| 2 | 22 |
| 3 | 33 |
+----+----+
SELECT * FROM merge_into_target_base_table;
+----+----+
| c1 | c2 |
+----+----+
| 2 | 10 |
| 1 | 1 |
+----+----+
Выполните оператор MERGE:
WITH tmp AS (SELECT * FROM merge_into_source_table)
MERGE INTO merge_into_target_base_table t1
USING tmp t2
ON t1.c1 = t2.c1
WHEN MATCHED AND t1.c2 = 10 THEN DELETE
WHEN MATCHED THEN UPDATE SET c2 = 10
WHEN NOT MATCHED THEN INSERT VALUES(t2.c1, t2.c2)
Выведите новые значения в целевой таблице (исходная таблица не изменилась):
SELECT * FROM merge_into_target_base_table;
+----+----+
| c1 | c2 |
+----+----+
| 3 | 33 |
| 1 | 10 |
+----+----+