Jump to content
Baia

[Resolvido] Atualizar ou inserir dados numa tabela baseada noutra

Recommended Posts

Baia

Boas estou com um problema e precisava de ajuda,

tenho valores de uma view e preciso de verificar se os valores que são retornados dessa view existem numa outra tabela, se existirem atualizo um campo, se nao existir insiro uma nova linha.

Por exemplo, a view retorna as colunas nome_empresa, cod_produto, e preco, e na outra tabela quero verificar se existe alguma linha com valores iguais aos retornados da view, se existir atualiza o preço, se nao existir insere uma nova linha.

Cumprimentos

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Recomendo a utilização do comando MERGE. Com uma só instrução fazes isso ;)

Exemplo:

USE tempdb;
GO

DECLARE @Vista TABLE (CodProduto INT, NomeEmpresa VARCHAR(20), Preco NUMERIC(10, 2));
DECLARE @Tabela TABLE (CodProduto INT, NomeEmpresa VARCHAR(20), Preco NUMERIC(10, 2));
INSERT INTO @Vista VALUES (100, 'ABCD', 12.30), (105, 'ABCD', 24.80), (124, 'ABCD', 99.99), (100, 'XPTO', 11.26);
INSERT INTO @Tabela VALUES (100, 'XPTO', 10.23), (101, 'TYTY', 102.78);

-- Antes tinhas isto:
SELECT * FROM @Tabela;

-- Estes são os dados da Vista, a aplicar:
SELECT * FROM @Vista;

MERGE @Tabela AS MyTarget
   USING (SELECT CodProduto, NomeEmpresa, Preco FROM @Vista) AS MySource
   ON MyTarget.CodProduto = MySource.CodProduto AND MyTarget.NomeEmpresa = MySource.NomeEmpresa
   WHEN MATCHED THEN UPDATE SET MyTarget.Preco = MySource.Preco
   WHEN NOT MATCHED BY TARGET THEN INSERT (CodProduto, NomeEmpresa, Preco) VALUES (MySource.CodProduto, MySource.NomeEmpresa, MySource.Preco);

-- Ao aplicar os dados da Vista:
   -- foram acrescentadas 3 linhas
   -- foi alterado uma linha (CodProduto = 100 e NomeEmpresa = XPTO)
   -- uma linha não foi alterada (CodProduto = 101 e NomeEmpresa = TYTY pois não estava na "vista")
SELECT * FROM @Tabela;

Espero ter ajudado

  • Vote 1

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Baia

:thumbsup: Obrigado Rechousa, ajudaste e bem, é mesmo isso.

Mas agora surgiu mais uma questão :S

na view podem existir várias linhas com a mesma empresa e com o mesmo produto variando o preço.

Dá para inserir ou atualizar apenas a linha que contiver o preço mais alto?

por exemplo na view tenho:

linha1: empresaA, produtoA, 16€

linha2: empresaA, produtoA, 18€

o objetivo é inserir ou atualizar apenas o preco 18€

Cumps

Share this post


Link to post
Share on other sites
Rechousa

Sim, só precisas de alterar a query de source no MERGE:

MERGE @Tabela AS MyTarget
   USING (SELECT CodProduto, NomeEmpresa, MAX(Preco) AS Preco FROM @Vista GROUP BY CodProduto, NomeEmpresa) AS MySource
   ON MyTarget.CodProduto = MySource.CodProduto AND MyTarget.NomeEmpresa = MySource.NomeEmpresa
   WHEN MATCHED THEN UPDATE SET MyTarget.Preco = MySource.Preco
   WHEN NOT MATCHED BY TARGET THEN INSERT (CodProduto, NomeEmpresa, Preco) VALUES (MySource.CodProduto, MySource.NomeEmpresa, MySource.Preco);

  • Vote 1

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Baia

:thumbsup: boa, não me tinha lembrado disso, entretanto adicionei uma condição que apenas faz update se o novo valor for maior que o existente

WHEN MATCHED THEN UPDATE SET MyTarget.Preco =  CASE WHEN MyTarget.Preco < MySource.Preco THEN MySource.Preco ELSE MyTarget.Preco END

Obrigado ;)

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.