Eu suponho que quando você repôs a pergunta, você quer uma sintaxe que funcione tanto no Oracle quanto no SQL Server, embora inevitavelmente afete apenas uma tabela.
O código SQL-92 Standard de nível básico é suportado por ambas as plataformas, portanto, o código SQL-92 de 'subconsultas escalares' a seguir deve funcionar:
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
);
Observe que, ao usar o nome de correlação
t1
para Ttble1
é uma sintaxe válida de acordo com o padrão SQL-92 isso irá materializar uma tabela e o UPDATE
irá então direcionar a tabela materializada 't1' e deixar sua tabela base 'table1' inalterada, o que eu suponho que não seja o efeito desejado. Embora eu tenha quase certeza de que o Oracle e o SQL Server não são compatíveis com esse aspecto e que, na prática, funcionariam conforme o esperado, não há mal em ser extremamente cauteloso e aderir à sintaxe SQL-92 qualificando totalmente a tabela de destino. As pessoas tendem a não gostar do código 'repetido' nas subconsultas acima (mesmo que o otimizador deva ser inteligente o suficiente para avaliá-lo apenas uma vez).
Versões mais recentes do Oracle e do SQL Server suportam o Standard SQL:2003
MERGE
sintaxe, poderia ser capaz de usar algo próximo a isso: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;
Acabei de notar que seu exemplo é ainda mais simples do que eu pensava e apenas requer uma subconsulta simples que deve ser executada na maioria dos produtos SQL, por exemplo
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);