Предполагам, че когато сте задали повторно въпроса, искате синтаксис, който ще работи както на 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 поддържат и двете поддържат Standard 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
);