Baia Posted May 20, 2013 at 03:25 PM Report #508088 Posted May 20, 2013 at 03:25 PM 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
Rechousa Posted May 20, 2013 at 03:54 PM Report #508092 Posted May 20, 2013 at 03:54 PM 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 1 Report Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
nelsonr Posted May 20, 2013 at 04:10 PM Report #508096 Posted May 20, 2013 at 04:10 PM Fantástico esse comando MERGE, não conhecia... 🙂
Rechousa Posted May 20, 2013 at 04:19 PM Report #508101 Posted May 20, 2013 at 04:19 PM 🙂 Ficou resolvido? Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
nelsonr Posted May 20, 2013 at 04:32 PM Report #508104 Posted May 20, 2013 at 04:32 PM (não fui eu quem colocou a questão inicial) 😄
Rechousa Posted May 20, 2013 at 04:33 PM Report #508105 Posted May 20, 2013 at 04:33 PM (não fui eu quem colocou a questão inicial) 😄 Tens razão, só me apercebi depois de eu ter respondido. Sorry 😄 Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
Baia Posted May 20, 2013 at 04:44 PM Author Report #508107 Posted May 20, 2013 at 04:44 PM 👍 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
Rechousa Posted May 20, 2013 at 04:50 PM Report #508110 Posted May 20, 2013 at 04:50 PM 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); 1 Report Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
Baia Posted May 20, 2013 at 05:25 PM Author Report #508116 Posted May 20, 2013 at 05:25 PM 👍 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 😉
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now