Назначение
Слияние записей источника в целевую таблицу (или обновляемое представление).
Синтаксис
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 ...]
Table 1. Параметры оператора MERGE
Параметр |
Описание |
target |
Целевая таблица или обновляемое представление. |
source |
Источник данных.Может быть таблицей, представлением, хранимой процедурой или производной таблицей. |
target_alias |
Псевдоним целевой таблицы или представления. |
source_alias |
Псевдоним источника. |
join condition |
Условие соединения целевой таблицы и источника. |
condition |
Дополнительные условия проверки в предложениях WHEN MATCHED или WHEN NOT MATCHED . |
col_name |
Столбец целевой таблицы или представления. |
m_value |
Значение, присваиваемое столбцу целевой таблицы.Выражение, которое может содержать литералы, PSQL переменные, столбцы из источника. |
return_expression |
Выражение, возвращаемое в предложении RETURNING . |
ret_alias |
Псевдоним для выражения, возвращаемого в предложении RETURNING . |
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
|
WHEN NOT MATCHED [BY TARGET] оценивается с точки зрения источника, т.е.таблицы или набора данных указанного в предложения USING .Так сделано потому, что если запись источника не имеет совпадения с записью цели, то выполняется INSERT .Разумеется, если запись цели не соответствует записи в источнике, то никакие действия не производятся.
На данный момент переменная ROW_COUNT возвращает значение 1, даже если было модифицировано или вставлено более 1 записи.См. CORE-4400.
|