Ir para conteúdo
Fórum Script Brasil
  • 0

Procedimento (Join de 2 tabelas e transferir dados )


Helio13

Pergunta

Boa tarde. Estou com um problema em criar um procedimento e precisava de ajuda...

Eu estou a transferir dados do access para o mysql

Mas antes de inserir esses dados da tabela definitiva, mando os dados primeiro para uma tabela temporária...

O que quero depois fazer é:

Comparar a tabela temporária com a tabela definitiva

Mas quero comparar um atributo que é a chave primária...caso já existas dados na tabela definitiva com a mesma chave primária que existe no tabela temporária, não insere esse registo para a tabela definitiva, caso não exista transfere esse registo

Concluindo, transferir da tabela temporária para a tabela definitiva os registos que a chave primária da tabela temporária não exista na tabela definitiva

Fiz me entender?

Já fiz isto mas não resulta, e não sei o que esta mal...?

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Join2`()
BEGIN

-- Definição de variáveis utilizadas no Procedimento
Declare CODIGO_INVENTARIO varchar(255);
Declare sitio, TIPO_ACHADO, CATEGORIA_ACH, MATERIA_PRIMA_ACH, NIVEL_ARTIFICIAL, CAMADA, QUADRADO, ORIENTACAO, INCLINACAO, DEPOSITO varchar(45);
Declare CONSOLIDACAO, RESTAURO, MOLDAGEM_REPLICA, ANALISE varchar(45);
Declare DESCRICAO, OBSERVACOES varchar(255);
Declare ANO, XN, YN, ZN,C_cm,L_cm,E_cm,A_cm,D_cm,CAIXA,CONTENTOR,PRATELEIRA int(11);
Declare a,b int default 0;

-- Definição do cursor
Declare c1 cursor for(
Select sip2.temp_teste.sitio
from sip2.temp_teste
inner join sip2.teste
on sip2.temp_teste.sitio = sip2.teste.sitio);

-- Definição da variável de controle de looping do cursor
Declare continue HANDLER for not found 
SET b = 1;

 -- Abre o cursor
OPEN c1;

Repeat

Fetch c1 into CODIGO_INVENTARIO, sitio,TIPO_ACHADO,CATEGORIA_ACH,MATERIA_PRIMA_ACH,DESCRICAO,ANO,NIVEL_ARTIFICIAL,CAMADA,QUADRADO,XN,YN,ZN,ORIENTACAO,INCLINACAO,DEPOSITO,C_cm,L_cm,E_cm,A_cm,D_cm,CONSOLIDACAO,RESTAURO,MOLDAGEM_REPLICA,ANALISE,CAIXA,CONTENTOR,PRATELEIRA,OBSERVACOES;

    if b = 0 then
     INSERT INTO sip2.teste (CODIGO_INVENTARIO, sitio,TIPO_ACHADO,CATEGORIA_ACH,MATERIA_PRIMA_ACH,DESCRICAO,ANO,NIVEL_ARTIFICIAL,CAMADA,QUADRADO,XN,YN,ZN,ORIENTACAO,INCLINACAO,DEPOSITO,C_cm,L_cm,E_cm,A_cm,D_cm,CONSOLIDACAO,RESTAURO,MOLDAGEM_REPLICA,ANALISE,CAIXA,CONTENTOR,PRATELEIRA,OBSERVACOES)
     values ('c1'); 
    SELECT * FROM sip2.temp_teste;
    end if;
    
until b = 1 
end repeat;

Close c1;

END

Se alguém me puder ajudar!?

Obrigado

Cumprimentos

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Boa tarde. Estou com um problema em criar um procedimento e precisava de ajuda...

Eu estou a transferir dados do access para o mysql

Mas antes de inserir esses dados da tabela definitiva, mando os dados primeiro para uma tabela temporária...

O que quero depois fazer é:

Comparar a tabela temporária com a tabela definitiva

Mas quero comparar um atributo que é a chave primária...caso já existas dados na tabela definitiva com a mesma chave primária que existe no tabela temporária, não insere esse registo para a tabela definitiva, caso não exista transfere esse registo

Concluindo, transferir da tabela temporária para a tabela definitiva os registos que a chave primária da tabela temporária não exista na tabela definitiva

Tente assim:

INSERT INTO tabela_definitiva (relacao de campos)
SELECT relacao de campos
FROM tabela_temporaria
WHERE pk_tabela_temporaria NOT IN (SELECT pk_tabela_temporaria 
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria );
Explicando:
SELECT pk_tabela_temporaria 
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria
busca o que tem de igual nas duas tabelas.
SELECT relacao de campos
FROM tabela_temporaria
WHERE pk_tabela_temporaria NOT IN (SELECT pk_tabela_temporaria 
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria )

Seleciona todos os registros que que NÃO estiverem retornados pelo select dentro do IN.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela ajuda...

Já tinha optado por esse caminho para não estar a usar cursores...

Podes me ajudar agora numa outra coisa?

É que agora queria eliminar aqueles registos que insiro na tabela definitiva, deixando só os registos não inseridos na tabela temporária...mas não estou a conseguir fazer isso..!?

Devo estar a fazer mal o Delete...

Alguém me pode ajudar?

Link para o comentário
Compartilhar em outros sites

  • 0
Obrigado pela ajuda...

Já tinha optado por esse caminho para não estar a usar cursores...

Podes me ajudar agora numa outra coisa?

É que agora queria eliminar aqueles registos que insiro na tabela definitiva, deixando só os registos não inseridos na tabela temporária...mas não estou a conseguir fazer isso..!?

Devo estar a fazer mal o Delete...

Alguém me pode ajudar?

A operação é parecida com a que postei anteriormente.

Primeiro, busque os que são iguais nas duas tabelas

SELECT pk_tabela_temporaria
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria
Segundo, informe que você quer deletar todos os registros da tabela_definitiva, exceto os que estiverem na igualdade acima(nas duas tabelas)
DELETE FROM tabela_definitiva
WHERE pk_tabela_definitiva NOT IN (SELECT pk_tabela_temporaria
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria)

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, estou a perceber...mas assim ele vai me apagar todos os registos da tabela temporaria, pois eu antes já passei para a definitiva os que não eram iguais.

Tentei agora e ele apaga me todos, pois estou a fazer isso a seguir ao codigo anterior que era para inserir :/

Tenho que apagar somente aqueles que insiro, e deixo aqueles que não insiro na tabele temporária...

Fiz me entender?

Tenho que fazer o delete no seguinte do insert que faço

Obrigado

Cumprimentos

Editado por Helio13
Link para o comentário
Compartilhar em outros sites

  • 0

OK.Agora entendi melhor.

Você vai precisar de uma segunda tabela temporária que irá receber o mesmo conjunto de dados que informei no primeiro post.

Esta tabela dedverá ter somente o campo pk da tabela temporaria.

Após voce inserir dados nela, insira os dados na tabela definitiva.

Depois de ter inserido os dados na tabela definitiva, delete os dados da tabela temporária que forem iguais aos dados da segunda tabela temporária.

Exemplo:

TRUNCATE TABLE tabela_temporaria2;

INSERT INTO tabela_temporaria2 (pk_tabela_temporaria)
SELECT pk_tabela_temporaria
FROM tabela_temporaria
WHERE pk_tabela_temporaria NOT IN (SELECT pk_tabela_temporaria
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria );

INSERT INTO tabela_definitiva (relacao de campos)
SELECT relacao de campos
FROM tabela_temporaria
WHERE pk_tabela_temporaria NOT IN (SELECT pk_tabela_temporaria
               FROM tabela_temporaria  t
               INNER JOIN tabela_definitiva d ON d.pk_tabela_definitiva = t.pk_tabela_temporaria );

DELETE FROM tabela temporaria t1
WHERE t1.pk_tabela_temporaria IN (SELECT pk_tabela_temporaria FROM tabela_temporaria2);

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...