none
Find Last no SQL RRS feed

  • 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
    quarta-feira, 6 de agosto de 2014 19:41

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]

    segunda-feira, 11 de agosto de 2014 16:58

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

    quarta-feira, 6 de agosto de 2014 20:17
  • 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 */

    quarta-feira, 6 de agosto de 2014 20:29
  • --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]

    segunda-feira, 11 de agosto de 2014 16:58