ГДЕ Заявление в МЕРГЕ - PullRequest
       6

ГДЕ Заявление в МЕРГЕ

0 голосов
/ 15 февраля 2019

Может кто-нибудь объяснить, как будет работать WHERE в конце оператора MERGE, если у него есть условия для цели и исходной таблицы?Например:

merge into target_table t
using source source_table s
on s.flield = t.field
when matched then update (...)
when not matched then insert (...)
where t.field != <value> and s.field != <value>

Я не могу понять, как будет решаться t.field, поскольку исходные строки не соответствуют ни одной строке целевой таблицы в предложении when not matched.

Я провел несколько тестов, поэтому мне кажется, что строки никогда не будут вставлены.

Я хочу знать: будет вставлена ​​строка или нет?

1 Ответ

0 голосов
/ 15 февраля 2019

С официальная документация Oracle для оператора MERGE :

Укажите where_clause, если вы хотите, чтобы база данных выполняла операцию обновления, только если указанное условие истинно.Условие может ссылаться либо на источник данных, либо на целевую таблицу.Если условие не выполнено, то база данных пропускает операцию обновления при объединении строки в таблицу.

Чтобы ответить на ваш вопрос явно («Я хочу знать: будет вставлена ​​любая строка или нет»)? "), ответ: НЕТ.

Почему?Потому что у вас неправильный синтаксис.

Вы используете столбец целевой таблицы (t.field) внутри merge_insert_clause, что недопустимо, и это должно вызвать ошибку ORA-38102: Invalid column in the INSERT WHERE Clause: см.этот пример скрипки!

Из документов:

merge_insert_clause указывает значения для вставки в столбец целевой таблицы, если условие предложения ON ложно.

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

Я надеюсь, что помог!

...