Supongo que cuando vuelva a plantear la pregunta desea que la sintaxis funcione tanto en Oracle como en SQL Server, aunque inevitablemente solo afectará a una tabla.
El código estándar SQL-92 de nivel de entrada es compatible con ambas plataformas, por lo tanto, el siguiente código SQL-92 de 'subconsultas escalares' debería 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
);
Tenga en cuenta que al usar el nombre de correlación t1
para Ttble1
es una sintaxis válida de acuerdo con el estándar SQL-92, esto materializará una tabla y el UPDATE
luego apuntará a la tabla materializada 't1' y dejará su tabla base 'table1' sin verse afectada, lo que supongo que no es el efecto deseado. Si bien estoy bastante seguro de que tanto Oracle como SQL Server no cumplen en este sentido y que en la práctica funcionaría como se esperaba, no hay nada de malo en ser extremadamente cauteloso y apegarse a la sintaxis de SQL-92 calificando completamente la tabla de destino.
A la gente no suele gustarle el código 'repetido' en las subconsultas anteriores (aunque el optimizador debería ser lo suficientemente inteligente como para evaluarlo solo una vez).
Las versiones más recientes de Oracle y SQL Server son compatibles con SQL estándar:2003 MERGE
sintaxis, podría usar algo parecido a esto:
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;
Acabo de notar que su ejemplo es incluso más simple de lo que pensé al principio y simplemente requiere una subconsulta simple que debería ejecutarse en la mayoría de los productos SQL, p.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);