Update em dados de tabelas relacionadas

Bom dia,

Estou com uma dúvida se seria possível realizar as alterações de um banco de dados da seguinte forma.

Exemplo:
Banco contem Tabela1(código, colunaA, colunaB, colunaC, colunaD)

Após mudanças no projeto vou precisar criar uma outra tabela, que a Tabela1 irá referenciar.

Tabela2(código, colunaB, colunaC)
Tabela1(código, colunaA, colunaD, pkCodigoTabela2)

Existe alguma forma de se fazer essa referencia com o update do sql para que não se precise importar todos os dados novamente? (Isso não seria algo viável). Se sim poderiam me dar uma ajuda?

Você está tratando da tabela1 que já existe, certo?
Talvez você precise criar uma stored procedure e alguns ponteiros para isso. Acredito que seja a solução mais indicada.

Sim, a tabela1 já existe.

Encontrei em alguns outros fóruns e cheguei a seguinte query abaixo, porém o Oracle SQL Developer não está aceitando essa query.

UPDATE TESTE1 JOIN TESTE2 ON TESTE2.COLUNA1 = TESTE1.COLUNA1 
SET COLUNA3PK = TESTE2.CODIGO


Erro a partir da linha : 1 no comando -
UPDATE TESTE1 JOIN TESTE2 ON TESTE2.COLUNA1 = TESTE1.COLUNA1 
SET COLUNA3PK = TESTE2.CODIGO
Erro na Linha de Comandos : 1 Coluna : 15
Relatório de erros -
Erro de SQL: ORA-00971: palavra-chave SET não encontrada
00971. 00000 -  "missing SET keyword"
*Cause:    
*Action:

Eu não consigo entender por que esse fetiche por update com join, mas, cada um faz o que quer.

Por que eu sugeri a SP com o ponteiro? O ponteiro pode criar uma tabela temporária, onde você copiaria a tabela1, depois, poderia criar a tabela2 e alterar a tabela1, conforme precisa.

Poderia me explicar como funcionária dessa forma?

Se a Tabela2 está vazia e deve ser preenchida com os dados da Tabela1, você nao deve usar update, mas sim insert.

Seria algo como:
insert into tabela2(codigo, colunaB, colunaC) select codigo, colunaB, colunaC from tabela1

Depois disso você modifica Tabela1 para apagar essas colunas dela:
Se a Tabela2 está vazia e deve ser preenchida com os dados da Tabela1, você nao deve usar update, mas sim insert.

Seria algo como:
insert into tabela2(codigo, colunaB, colunaC) select codigo, colunaB, colunaC from tabela1

Depois disso você modifica Tabela1 para apagar essas colunas dela:
alter table tabela 1 drop column <coluna>

A coisa estranha nessa modelagem, é que você tem uma referência da tabela1 para tabela2 (pkCodigoTabela2)…como a tabela2 foi criada depois, seria mais comum você ter na tabela2 uma referência para a tabela1

Ele está refatorando o modelo dele, desvinculando a coluna2 da tabela1 e passando esta coluna para uma tabela à parte.

É exatamente como o darlan disse.

Talvez nao tenha entendido seu problema.

Esse esquema de 2 tabelas, será a forma como o sistema irá trabalhar daqui pra frente?
Você precisa migrar esses dados uma única vez ou constantemente?
Você já tem algum dado na tabela2 ou eles serao criados baseados no conteúdo da tabela1?

Isso, daqui pra frente é assim que irei utilizar.

Uma única vez, após isso eu irei utilizar as duas tabelas normalmente.

Eles serão criados a partir do conteúdo na tabela1, porém isso será feito antes de criar o vinculo entre as duas tabelas.

Isso está ocorrendo porque meu escopo mudou.

O que tenho agora, por exemplo:
Tabela1 com os seguintes dados:
Código | Cpf | Nome | Formação
1 | 123.123.123-12 | AbelBueno | Médio
2 | 123.123.123-12 | AbelBueno | Superior

Agora eu vou precisar ter.
Tabela2:
Código | Cpf | Nome
1 | 123.123.123-12 | AbelBueno

Tabela1:
Código | “Cpf” | Formação | CodigoTabela2Pk
1 | Médio | 1
2 | Superior | 1

Conseguiu entender agora?

Os dados da Tabela1 e Tabela2 eu já irei ter, agora eu preciso criar o vinculo entre as duas tabela através do CodigoTabela2Pk, porém não sei como fazer isso. (Irei utilizar o Cpf para o vinculo depois irei excluir essa coluna).

Agora entendi porque a referência da tabela2 está na tabela1.

Para atualizar a tabela 1 você pode usar um update com uma subquery :

update tabela1 set CodigoTabela2Pk = (select codigo from tabela2 where tabela2.cpf = tabela1.cpf) 

Funcionou em um pequeno teste que eu fiz aqui, quando o fizer no banco principal e obter sucesso volto a postar.

E pensar que pensei na solução mas achei que não seria possível referenciar sem dar from novamente na tabela1.

Muito obrigado :slight_smile: