Интересно, что такое поведение Oracle в отношении подзапроса и выполнения предложения update и delete.Каков порядок выполнения предложений Oracle MERGE INTO с подзапросом
Интересно, если Oracle:
- выполняет подзапрос и для каждой строки, он выполняет обновление и УДАЛИТЬ положения
- выполняет подзапрос для обновления, а затем выполняет подзапрос для удаления
- 1) и 2), оптимизатор выбирает наилучшую стратегию
- Другое?
EDIT:
DB используется: Oracle 11.2.0.3.0 Я это довольно запрос
DROP TABLE T1; DROP TABLE IT1; DROP TABLE OT1; CREATE TABLE T1 ( ID INTEGER, V INTEGER, PIVOT INTEGER ); CREATE TABLE IT1 ( ID INTEGER ); CREATE TABLE OT1 ( ID INTEGER, FOO INTEGER, NV INTEGER ); INSERT INTO T1 (ID,V,PIVOT) VALUES (1,1,1); INSERT INTO T1 (ID,V,PIVOT) VALUES (2,1,1); INSERT INTO IT1 (ID) VALUES (1); INSERT INTO IT1 (ID) VALUES (2); INSERT INTO OT1 (ID,NV,FOO) VALUES (1,2,0); INSERT INTO OT1 (ID,NV,FOO) VALUES (2,2,0); commit; MERGE INTO T1 TARGET USING ( SELECT DISTINCT T1.ID,T1.V, OT1.NV FROM T1 INNER JOIN IT1 ON T1.ID = IT1.ID LEFT OUTER JOIN OT1 ON OT1.ID = IT1.ID WHERE T1.PIVOT = 1 or OT1.FOO=40) SRC ON (SRC.ID = TARGET.ID) WHEN MATCHED THEN UPDATE SET TARGET.V=SRC.NV DELETE WHERE TARGET.V=SRC.V; commit;
Если элемент имеет новую версию, то элемент будет обновляться новая версия (предложение UPDATE). Если нет, элемент уничтожается (предложение DELETE). Удалить не должно быть
Это заявление не работает, как я ожидаю. Он удаляет все ссылки. Это было похоже на предложения delete, которые выполняют подзапрос с измененными данными.
Обратите внимание на OT1.FOO = 40, который здесь бесполезен, но, похоже, создает проблему. Если я добавлю order by
к подзапросу (независимо от критерия заказа), инструкция работает правильно.
Спасибо,
Николя
Проверьте это: - http://docs.oracle.com/cd/B28359_01/server.111/b28286/ statements_9016.htm –
Я уже читал документ и не очень полезен о заказе –