Jump to content
Fórum Script Brasil
  • 0

Procedimento (Join de 2 tabelas e transferir dados )


Helio13
 Share

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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

Edited by Helio13
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.7k
×
×
  • Create New...