Похоже, я не могу обновить несколько
Таблицы в одном утверждении.
Есть ли синтаксис, который работает для
Oracle и MSSql при обновлении с использованием
Регистрация
Я предполагаю, что когда вы снова зададите вопрос, вам нужен синтаксис, который будет работать как на Oracle, так и на SQL Server, даже если он неизбежно повлияет только на одну таблицу.
Начальный уровень Стандартный код SQL-92 поддерживается обеими платформами, поэтому должен работать следующий код SQL-92 «скалярные подзапросы»:
UPDATE table1
SET my_value = (
SELECT t2.tab1_id
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
)
WHERE id = 1234
AND EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);
Обратите внимание, что при использовании имени корреляции t1
для Ttble1
допустимый синтаксис в соответствии со стандартом SQL-92 это материализует таблицу, а UPDATE
будет затем нацелен на материализованную таблицу 't1' и покинет базу Таблица 'table1` незатронута, что я предполагаю, не является желаемым эффектом. Хотя я вполне уверен, что и Oracle, и SQL Server не соответствуют этим требованиям, и что на практике все будет работать, как и ожидалось, нет ничего плохого в том, чтобы быть крайне осторожным и придерживаться синтаксиса SQL-92, полностью квалифицируя целевую таблицу.
Людям не нравится «повторный» код в вышеприведенных подзапросах (хотя оптимизатор должен быть достаточно умен, чтобы оценивать его только один раз).
Более поздние версии Oracle и SQL Server поддерживают оба стандарта SQL: 2003 MERGE
Синтаксис, возможно, сможет использовать что-то похожее на это:
MERGE INTO table1
USING (
SELECT t2.tab1_id
FROM table2 AS t2
) AS source
ON id = source.tab1_id
AND id = 1234
WHEN MATCHED THEN
UPDATE
SET my_value = source.tab1_id;
Я только что заметил, что ваш пример еще проще, чем я думал, и просто требует простого подзапроса, который должен работать на большинстве продуктов SQL, например.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);