MERGE
Слияние записей источника в целевую таблицу (или обновляемое представление).
DSQL, PSQL
MERGE INTO target [[AS] target_alias] USING <source> [[AS] source_alias] ON <join condition> <merge when> [<merge when> ...] [<plan clause>] [<order by clause>] [<returning clause>] <source> ::= tablename | (<select_stmt>) <merge when> ::= <merge when matched> | <merge when not matched by target> | <merge when not matched by source> <merge when matched> ::= WHEN MATCHED [ AND <condition> ] THEN { UPDATE SET <assignment_list> | DELETE } <merge when not matched by target> ::= WHEN NOT MATCHED [ BY TARGET ] [ AND <condition> ] THEN INSERT [ <left paren> <column_list> <right paren> ] VALUES <left paren> <value_list> <right paren> <merge when not matched by source> ::= WHEN NOT MATCHED BY SOURCE [ AND <condition> ] THEN { UPDATE SET <assignment list> | DELETE } <assignment_list> ::= col_name = <m_value> [, colname = <m_value> ...] <column_list> ::= col_name [, col_name ...] <value_list> ::= <m_value> [, <m_value> ...] <m_value> ::= <value_expression> | DEFAULT <returning clause> ::= RETURNING <returning_list> [INTO <variable_list>] <returning_list> ::= * | <output_column> [, <output_column] <output_column> ::= target.* | NEW.* | OLD.* | <return_expression> [COLLATE collation] [[AS] ret_alias] <return_expression> ::= <value_expression> | [target.]col_name | NEW.col_name | OLD.col_name <value_expression> ::= <literal> | <context-variable> | <other-single-value-expr> <variables> ::= [:]varname [, [:]varname ...]
Параметр | Описание |
---|---|
target |
Целевая таблица или обновляемое представление. |
source |
Источник данных.Может быть таблицей, представлением, хранимой процедурой или производной таблицей. |
target_alias |
Псевдоним целевой таблицы или представления. |
source_alias |
Псевдоним источника. |
join condition |
Условие соединения целевой таблицы и источника. |
condition |
Дополнительные условия проверки в предложениях |
col_name |
Столбец целевой таблицы или представления. |
m_value |
Значение, присваиваемое столбцу целевой таблицы.Выражение, которое может содержать литералы, PSQL переменные, столбцы из источника. |
return_expression |
Выражение, возвращаемое в предложении |
ret_alias |
Псевдоним для выражения, возвращаемого в предложении |
varname |
Имя PSQL переменной. |
Оператор MERGE
производит слияние записей источника и целевой таблицы (или обновляемым представлением).В процессе выполнения оператора MERGE
читаются записи источника и выполняются INSERT, UPDATE или DELETE для целевойтаблицы в зависимости от условий.
Источником может быть таблица, представление, хранимой процедурой или производной таблицей. При выполнении оператора MERGE
производится соединение между источником (USING) и целевой таблицей. Тип соединения зависит от присутствия предложений WHEN NOT MATCHED
:
-
<merge when not matched by target> и <merge when not matched by source> — FULL JOIN
-
<merge when not matched by source> — RIGHT JOIN
-
<merge when not matched by target> — LEFT JOIN
-
только <merge when matched> — INNER JOIN
Действие над целевой таблицей, а также условие при котором оно выполняется, описывается в предложении WHEN
. Допускается несколько предложений WHEN MATCHED
, WHEN NOT MATCHED [BY TARGET]
и WHEN NOT MATCHED BY SOURCE
.
Если условие в предложении WHEN
не выполняется, то Firebird пропускает его и переходим к следующему предложению. Так будет происходить до тех пор, пока условие для одного из предложений WHEN
не будет выполнено. В этом случае выполняется действие, связанное с предложением WHEN
, и осуществляется переход на следующую запись результата соединения между источником (USING) и целевой таблицей. Для каждой записи результата соединения выполняется только одно действие.
Note
|
На данный момент переменная ROW_COUNT возвращает значение 1, даже если было модифицировано или вставлено более 1 записи.См. CORE-4400. |