Может ли кто-нибудь объяснить, что на самом деле делает оператор MERGE в Oracle? - PullRequest
11 голосов
/ 01 февраля 2011

Я ищу четкое объяснение того, что на самом деле делает оператор 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».Я прав?

Спасибо.

Ответы [ 2 ]

11 голосов
/ 01 февраля 2011

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

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

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

относительно части WHEN MATCHED: что происходит, когда строка из t соответствует нескольким строкам из s?

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

Как указал @ Vincent Malgrat, это было неверно.Похоже, что Oracle выдаст ошибку «ORA-40926: невозможно получить стабильный набор строк в исходной таблице» при наличии нескольких совпадений.

относительно части WHEN NOT MATCHED. Я верю в этоозначает «когда строка в s не имеет соответствия в t».Я прав?

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

2 голосов
/ 01 февраля 2011

довольно хорошая статья здесь http://www.oracle -developer.net / display.php? Id = 203

...