Подтвердить что ты не робот

Может ли кто-нибудь объяснить, что действительно делает выражение MERGE в Oracle?

Я ищу четкое объяснение того, что делает оператор MERGE в Oracle.

Вот что я делаю после:

MERGE INTO (target_table) t
USING (source_view) s
   ON (join condition)
 WHEN MATCHED THEN UPDATE SET col1 = val1 [, ...]
 WHEN NOT MATCHED THEN INSERT (col1 [, ...]) VALUES ( val1 [, ...])
  • какое соединение выполняется? Я думаю, что это полное внешнее соединение, я прав?
  • относительно части WHEN MATCHED: что происходит, когда строка из t соответствует нескольким строкам из s?
  • относительно части WHEN NOT MATCHED, я считаю, что это означает "когда строка в s не имеет соответствия в t". Я прав?

Спасибо.

4b9b3361

Ответ 1

какое соединение выполняется? я думаю, что это полное внешнее соединение, я не так ли?

Нет, это регулярное внешнее соединение. Запрос должен знать, когда в целевой таблице есть строки, которые также находятся в исходной таблице, и когда в исходной таблице есть записи, которые не находятся в целевой таблице. Поскольку для запроса не требуется отвечать на строки, которые находятся в целевой таблице, но не находятся в исходной таблице, ему не нужно, чтобы внешнее соединение проходило в обоих направлениях.

Однако внешнее соединение не будет выполняться, если нет предложения not matched (что совершенно верно). Оптимизатор достаточно умен, чтобы знать, что в этом случае достаточно внутреннего соединения.

относительно КОГДА СМ. ЧАСТЬ: что происходит, когда строка из t совпадает несколько строк из s?

При наличии нескольких совпадений обновление выполняется для каждого совпадения. Это означает, что в зависимости от того, какое обновление будет последним, будет указано сообщение, записанное в фиксации. Нет никакого способа диктовать заказ, поэтому в этом случае источник обновления является фактически случайным (из набора совпадений).

Как отметил Винсент Мальграт, это было неправильно. Похоже, что Oracle будет производить ошибку "ORA-40926: невозможно получить стабильный набор строк в исходной таблице", если имеется несколько совпадений.

относительно КОГДА НЕ СМ. ЧАСТЬ я верьте, что это означает: "когда строка в s нет соответствия в t". Правильно ли я?

Это правильно.