Como atualizar uma tabela de outra tabela


28

Eu tenho uma tabela A com coluna (id, campo_1, campo_2) e outra tabela B tem coluna (id, campo_2)

Agora, quero mesclar a tabela B para A, o que significa que quero atualizar o campo_2 na tabela A para o valor da tabela B. Então, como implementar isso? BTW eu estou usando oracle

obrigado


As duas tabelas contêm o mesmo número de registros?
Ujjwalesri

Respostas:


29

Uma abordagem alternativa para a subconsulta correlacionada (sugerida por Kerri) seria usar a instrução MERGE, que pode ser mais eficiente que a subseleção (que só pode ser verificada observando o plano de execução de ambas as instruções).

MERGE INTO table_b 
USING 
(
  SELECT id,
         field_2
  FROM table_a
) ta ON (ta.id = table_b.id)
WHEN MATCHED THEN UPDATE 
    SET table_b.field_2 = ta.field_2

2
A única restrição à MERGEinstrução é que você não pode atualizar a coluna na qual está unida, ou seja, não é possível atualizar a coluna usada na ONcláusula.
Lalit Kumar B

Isso funcionou para mim, atualizadas 2,5 milhões de linhas vs. tentar o método de sub-consulta que durou talvez 45 minutos antes erroring comORA-01555: snapshot too old
helmy

15

Não sei exatamente o que você quer depois, mas isso deve funcionar de forma pontual ou contínua por meio de um trabalho agendado:

UPDATE table_a a
   SET field_2 = ( SELECT field_2
                     FROM table_b b
                    WHERE b.id = a.id )
;

Agora, cada vez que o acima é executado, ele será feito em todas as linhas da tabela. Se isso é algo que você precisa fazer o tempo todo, sugiro outra coisa, mas para tabelas pontuais ou muito pequenas isso deve ser suficiente.


2

Eu fiz isso com sucesso usando uma tabela no usuário1 de outra tabela no usuário2:

update user1.table1 a
set a.field1 = (
  select b.field1
  from user2.table2 b
  where a.field1=b.field1
)
where <condition for update user1.table1>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.