Jump to content
António Canhôto

ANSWERED Criar tabela/consulta para identificar novos valores entre 2 tabelas

Recommended Posts

António Canhôto

Preciso de ajuda para o seguinte problema: tenho a tabela1(Tab1) e a tabela2 (Tab2), onde tem campos iguais. No entanto, por vezes, os dados dos campos da Tab1 poderão ser alterados para novos valores. Precisava de comparar as Tab1 e a Tab2 e criar uma tabela3 (Tab3) ou uma consulta que identificasse apenas os dados que foram alterados na Tab1. Mostro um exemplo para facilitar a compreensão do problema.
Ao comparar a Tab1 com a Tab 2 temos:
Na Tab1 tenho um registo novo (campo1: 1070 e campo 2: Aveiro) então esta linha deverá aparecer na Tab3.
Na Tab1 tenho um registo que mudou de local (campo1: 1069 e campo2: Lisboa), então também deverá aparecer na Tab3.
Como o campo 1 e campo2 do registo 1068 são iguais entre as duas tabelas (Tab1 e Tab2) então não será necessário aparecer na Tab3

Como resolver esta questão?
Obrigado

Tab1                         Tab2                          Tab3
IDSAP  Local           IDSAP  Local            IDSAP  Local

1068    Porto           1068  Porto              1069  Lisboa
1069    Lisboa         1069  Coimbra         1070 Aveiro
1070    Aveiro

Share this post


Link to post
Share on other sites
Cerzedelo

Talvez devesse utilizar as stored procedures do SQL, para automatizar um pouco esse procedimento.

Para saber se existe um mesmo valor de um campo entre 2 tabelas pode usar o INNER JOIN

Edited by Cerzedelo

Share this post


Link to post
Share on other sites
antseq
18 horas atrás, António Canhôto disse:

Como resolver esta questão?
Obrigado
 

Segue exemplo. Só lhe interessa a parte do "INSERT INTO #TAB3...":

IF OBJECT_ID('tempdb..#TAB1') IS NOT NULL DROP TABLE #TAB1;
IF OBJECT_ID('tempdb..#TAB2') IS NOT NULL DROP TABLE #TAB2;
IF OBJECT_ID('tempdb..#TAB3') IS NOT NULL DROP TABLE #TAB3;
GO 

CREATE TABLE #TAB1([IDSAP] INT, [LOCAL] NVARCHAR(50));
CREATE TABLE #TAB2([IDSAP] INT, [LOCAL] NVARCHAR(50));
CREATE TABLE #TAB3([IDSAP] INT, [LOCAL] NVARCHAR(50));
GO

INSERT INTO #TAB1([IDSAP], [LOCAL]) VALUES (1068, 'Porto'), (1069, 'Lisboa'), (1070, 'Aveiro');
INSERT INTO #TAB2([IDSAP], [LOCAL]) VALUES (1068, 'Porto'), (1069, 'Coimbra');
GO

SELECT * FROM #TAB1;
SELECT * FROM #TAB2;

INSERT INTO #TAB3
SELECT * FROM #TAB1 t1
WHERE NOT EXISTS(
	SELECT *
	FROM #TAB2 t2 WHERE (t1.[IDSAP] = t2.[IDSAP]) AND (t1.[LOCAL] = t2.[LOCAL])
	)

SELECT * FROM #TAB3;	

OUTPUT:

IDSAP    LOCAL
1068    Porto
1069    Lisboa
1070    Aveiro

IDSAP    LOCAL
1068    Porto
1069    Coimbra

IDSAP    LOCAL
1069    Lisboa
1070    Aveiro

Share this post


Link to post
Share on other sites
António Canhôto
Em 06/08/2020 às 12:05, antseq disse:

INSERT INTO #TAB1([IDSAP], [LOCAL]) VALUES (1068, 'Porto'), (1069, 'Lisboa'), (1070, 'Aveiro'); INSERT INTO #TAB2([IDSAP], [LOCAL]) VALUES (1068, 'Porto'), (1069, 'Coimbra');

Boa tarde, desde já agradeço todas as respostas enviadas para me ajudarem. Relativamente à linha de código acima citada apresento o seguinte esclarecimento e a seguinte dúvida:

Apenas apresentei 3 ou 4 registos para se ter uma ideia. Na verdade são muitos registos com diferentes localizações, por isso, quando tenho de escrever na linha de código especificamente as localidades e o IDSAP, será um trabalho árduo. Será possível reescrever o código de forma a comparar esses dois campos entre as duas tabelas com uma função AND, de forma a verificar se são iguais?

 

Nota: Posso estar a escrever alguma barbaridade, mas apresento as minhas desculpas pois sou algo inexperiente.

 

Obrigado.

Share this post


Link to post
Share on other sites
Cerzedelo
Em 06/08/2020 às 16:39, António Canhôto disse:

Boa tarde, desde já agradeço todas as respostas enviadas para me ajudarem. Relativamente à linha de código acima citada apresento o seguinte esclarecimento e a seguinte dúvida:

Apenas apresentei 3 ou 4 registos para se ter uma ideia. Na verdade são muitos registos com diferentes localizações, por isso, quando tenho de escrever na linha de código especificamente as localidades e o IDSAP, será um trabalho árduo. Será possível reescrever o código de forma a comparar esses dois campos entre as duas tabelas com uma função AND, de forma a verificar se são iguais?

 

Nota: Posso estar a escrever alguma barbaridade, mas apresento as minhas desculpas pois sou algo inexperiente.

 

Obrigado.

Se pretende obter os campos que são iguais nas duas tabelas faça um SELECT INNER JOIN. Veja o seguinte exemplo https://www.w3schools.com/sql/sql_join.asp

Share this post


Link to post
Share on other sites
antseq
Em 06/08/2020 às 15:39, António Canhôto disse:

Boa tarde, desde já agradeço todas as respostas enviadas para me ajudarem. Relativamente à linha de código acima citada apresento o seguinte esclarecimento e a seguinte dúvida:

Apenas apresentei 3 ou 4 registos para se ter uma ideia. Na verdade são muitos registos com diferentes localizações, por isso, quando tenho de escrever na linha de código especificamente as localidades e o IDSAP, será um trabalho árduo. Será possível reescrever o código de forma a comparar esses dois campos entre as duas tabelas com uma função AND, de forma a verificar se são iguais?

Obrigado.

Viva,

Esqueça os meus INSERTS e CREATE TABLES... foram para criar o meu "ambiente de testes" baseado nos seus exemplos.

Como comentei, só lhe interessa a parte do SELECT usado no INSERT #TAB3 (as tabelas 1 e 2 supostamente já as deve ter).

Substitua o #TAB1 e #TAB2 pelos nomes das suas tabelas 1 e 2 (ajuste o nome dos campos se necessário]

SELECT * FROM #TAB1 t1
WHERE NOT EXISTS(
	SELECT *
	FROM #TAB2 t2 WHERE (t1.[IDSAP] = t2.[IDSAP]) AND (t1.[LOCAL] = t2.[LOCAL])
	)

 

Share this post


Link to post
Share on other sites
António Canhôto

Boa noite,

Após várias tentativas consegui que funcionasse o código apresentado pelo antseq.

Saúde e obrigado pelo apoio prestado neste forum, especialmente ao antseq.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.