Usuário com melhor resposta
Find Last no SQL

Pergunta
-
Bom dia Pessoal,
Estou com seguinte problema, tenho 2 tabelas sendo uma de Logs e precisaria fazer isso via SQl, exemplo :
Tabela 1 :
Codigo Produto
00001 Lapis
00002 Caneta
00003 Caderno
Tabela 2:
Codigo Descrição
00001 Cadastro do Produto
00001 Erro ao Integrar com Sistema Proprio
00001 Exclusão do Codigo pelo usuario Teste
00002 Cadastro do Produto
00002 Integrado com Sucesso no Sistema Proprio
00003 Cadastro do Produto
00003 Erro ao Integrar com Sistema Proprio
Com estas duas tabelas gostaria de montar um SQL para ter o seguinte resultado :
Codigo Produto Descrição
00001 Lapis Exclusão do Codigo pelo usuario Teste
00002 Caneta Integrado com Sucesso no Sistema Proprio
00003 Caderno Erro ao Integrar com Sistema Proprio
Mas no SQL só consigo mostrar um mix de todos os registros como o abaixo, porem em um tabela com 33000 produtos e uma quantidade infinita de Logs, gera um resultado que o computador não consegue processar devido ao grande numero de registros.
Codigo Produto Descrição
00001 Lapis Cadastro do Produto
00001 Lapis Erro ao Integrar com Sistema Proprio
00001 Lapis Exclusão do Codigo pelo usuario Teste
00002 Caneta Cadastro do Produto
00002 Caneta Integrado com Sucesso no Sistema Proprio
00003 Caderno Cadastro do Produto
00003 Caderno Erro ao Integrar com Sistema Proprio
Att,
Sidival
Respostas
-
--Boa tarde, Segue outra solução:
declare @table1 as table( id int identity, descricao char(100) ) declare @table2 as table( id int identity, idTable1 int, descricao char(100), data datetime default getdate() not null ) insert into @table1 (descricao) values ('Produto A'), ('Produto B'), ('Produto C') insert into @table2 (idTable1, descricao) values (1, 'Log 1 do Produto A'), (1, 'Log 2 do Produto A'), (1, 'Log 3 do Produto A'), (2, 'Log 1 do Produto B'), (2, 'Log 2 do Produto B'), (3, 'Log 1 do Produto C'), (3, 'Log 2 do Produto C'), (3, 'Log 3 do Produto C') --Causando o seu problema select * from @table1 a inner join @table2 b on a.id = b.idTable1 --Resolvendo o problema select * from @table1 a cross apply ( select top 1 * from @table2 b where a.id = b.idTable1 order by id desc ) as x
Jefferson Santos [MCTS SQL Server]
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator quarta-feira, 13 de agosto de 2014 18:38
Todas as Respostas
-
Boa tarde,
Experimente fazer um teste com uma subquery mais ou menos dessa forma:
select p.Codigo, p.Produto, (select top 1 l.Descricao from Logs as l where l.Codigo = p.Codigo order by l.IdLog desc) as Descricao from Produtos as p
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Boa tarde Sidival,
Você tem algum campo na tabela 2 que indique qual é o último registro? Por exemplo uma data de inclusão?
Eu fiz um exemplo reproduzindo suas tabelas em temporárias, apenas para ilustrar, considerando que você tem um campo data inclusão que diz qual registro da tabela 2 é o último.CREATE TABLE #TABELA1 (CODIGO VARCHAR(10), DESCRICAO VARCHAR (100)) CREATE TABLE #TABELA2 (CODIGO VARCHAR(10), DESCRICAO VARCHAR (100), DataInclusao DATETIME) INSERT INTO #TABELA1 VALUES ('00001', 'Lapis'), ('00002', 'Caneta'), ('00003','Caderno') INSERT INTO #TABELA2 VALUES ('00001', 'Cadastro do Produto', '2014-01-01'), ('00001', 'Erro ao Integrar com Sistema Proprio', '2014-03-01'), ('00001', 'Exclusão do Codigo pelo usuario Teste','2014-05-01' ), ('00002', 'Cadastro do Produto','2014-01-01'), ('00002', 'Integrado com Sucesso no Sistema Proprio', '2014-05-01'), ('00003', 'Cadastro do Produto', '2014-01-01'), ('00003', 'Erro ao Integrar com Sistema Proprio', '2014-012-01'); WITH CTE (NUMLINHA, CODIGO, DESCRICAO) AS ( SELECT ROW_NUMBER() OVER (PARTITION BY CODIGO ORDER BY DataInclusao DESC), CODIGO, DESCRICAO FROM #TABELA2 ) SELECT A.CODIGO, A.DESCRICAO, B.DESCRICAO FROM #TABELA1 A INNER JOIN CTE B ON A.CODIGO = B.CODIGO where B.NUMLINHA = 1
Espero que ajude...
[]'s
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Roberto F FonsecaModerator segunda-feira, 11 de agosto de 2014 19:47
-
--Boa tarde, Segue outra solução:
declare @table1 as table( id int identity, descricao char(100) ) declare @table2 as table( id int identity, idTable1 int, descricao char(100), data datetime default getdate() not null ) insert into @table1 (descricao) values ('Produto A'), ('Produto B'), ('Produto C') insert into @table2 (idTable1, descricao) values (1, 'Log 1 do Produto A'), (1, 'Log 2 do Produto A'), (1, 'Log 3 do Produto A'), (2, 'Log 1 do Produto B'), (2, 'Log 2 do Produto B'), (3, 'Log 1 do Produto C'), (3, 'Log 2 do Produto C'), (3, 'Log 3 do Produto C') --Causando o seu problema select * from @table1 a inner join @table2 b on a.id = b.idTable1 --Resolvendo o problema select * from @table1 a cross apply ( select top 1 * from @table2 b where a.id = b.idTable1 order by id desc ) as x
Jefferson Santos [MCTS SQL Server]
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator quarta-feira, 13 de agosto de 2014 18:38