Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Atualizar usando Join(s) - Multi DB/Table


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