Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Baia

[Resolvido] Atualizar ou inserir dados numa tabela baseada noutra

Mensagens Recomendadas

Baia    3
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rechousa    63
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


Pedro Martins

Sharing is Knowledge!

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baia    3
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rechousa    63
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);


Pedro Martins

Sharing is Knowledge!

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baia    3
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 ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.