sql >> Base de Datos >  >> RDS >> Oracle

Actualizar usando Join(s) - Multi DB/Table

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
              );