Update com Join no Oracle

Olá amigos(as),

     Se você assim como eu, está passando por uma transição do SQL Server para o Oracle, deve ter se deparado com algumas particularidades na hora de construir suas queries. Algumas coisas que eu fazia no SQL Server a nível de sintaxe, são um pouco diferentes no Oracle e para quem não esta familiarizado com isso, acaba apanhando um pouco, como tem acontecido comigo. Então, para compartilhar esse meu aprendizado, vou postar aqui coisas que eu fazia no SQL Server e no Oracle são diferentes, vai servir como um repositório de consulta para mim mesmo :).

     Uma coisa que precisei recentemente, foi fazer um update em uma tabela "X" cruzando os dados com uma tabela "Y", já estava cansado de fazer isso no SQL Server e quando precisei no Oracle, fui todo "marrento" executar minha instrução, que para minha decepção não funcionou.

----------------------------------------
--Como eu fazia no SQL Server
----------------------------------------
UPDATE TABELA_X
SET COD_CAMPO = B.COD_CAMPO
FROM TABELA_X A
INNER JOIN TABELA_Y B
ON A.COD_CAMPO_XYZ = B.COD_CAMPO_XYZ AND A.NOME_CAMPO_XYZ = A.NOME_CAMPO_XYZ

Depois de pesquisar um pouco, achei algumas soluções que me servirão para solucionar meu problema, então segue a mesma aqui.

--------------------------------------------------------------------------------------
-- Como deve ser feito no Oracle
-- Podem existir outras formas, mas para mim funcionou essa ai abaixo
--------------------------------------------------------------------------------------

MERGE INTO OWNER.TABELA_X A
USING OWNER.TABELA_Y B
ON(A.COD_CAMPO_XYZ = B.COD_CAMPO_XYZ AND A.NOME_CAMPO_XYZ = A.NOME_CAMPO_XYZ)
WHEN MATCHED THEN
     UPDATE
     SET COD_CAMPO = B.COD_CAMPO;


Observações: 
  1. Utilizei essa querie no Oracle 11g com o PL/SQL Developer.
  2. O OWNER é o dono da tabela, no SQL Server você não precisa informar este tipo de dado, isso é transparente para nós, já no Oracle isso é necessário, principalmente quando as tabelas são de OWNER's diferentes, como é o meu caso. 
  3. Outro detalhe, o ponto e virgula não está na instrução do Oracle apenas como enfeite, ele serve para diferenciar uma instrução de outra, caso exista.

Espero poder ajudar quem assim como eu, ficou batendo cabeça com coisas simples e o Oracle te negando um update :).

Documentação oficial Oracle:
UPDATE
<http://docs.oracle.com/cd/E11882_01/server.112/e10592/statements_10008.htm#SQLRF01708>

MERGE
<http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm>


Até a próxima.

Comentários