none
Join com 3 Tables RRS feed

  • Pergunta

  • Boa noite.

    Estou inciando em SQLServer e tenho este problema. 

    O senário é o seguinte.

    -----------------------
    EQUIPAMENTOS
    -----------------------
    IDEQUIPAMENTO
    NOME
    ETC


    -----------------------
    MOVIMENTACAOEQUIPAMENTO
    -----------------------
    IDMOVEQUI
    IDESTUDIO
    DESCRICAO
    ETC


    -----------------------
    ESTUDIO
    -----------------------
    IDESTUDIO
    NOME
    ETC


    A Tabela ESTUDIO se relaciona com a tabela EQUIPAMENTOS através da movimentação, onde o que me mostra o local atual de um equipamento é sempre o ultimo registro da tabela MOVIMENTACAOEQUIPAMENTO para este equipamento.

    Entao, eu preciso retornar todos os registros de equipamentos relacionando somente a ultima movimentação de cada equipamento.

    Ja tentei varios Joins, Usei o LINQPad para afim de tentar resolver com LINQ para ver qual consulta me retornaria porem sem sucesso. Obrigado.


    sábado, 6 de outubro de 2012 22:10

Respostas

  • Boa noite,

    Experimente desta forma:

    with CTE as
    (
        select 
            idEquip,
            idEstudio,
            ROW_NUMBER() OVER(PARTITION BY idEquip ORDER BY idEquipMov DESC) as RowNum
        from [dbo].[EquipsMovs]
    )
    
    select eq.*, es.*
    from [dbo].[Equips] as eq
    join CTE as c on c.idEquip = eq.idEquip and c.RowNum = 1
    join Estudios as es on es.idEstudio = c.idEstudio
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Soró domingo, 7 de outubro de 2012 02:18
    sábado, 6 de outubro de 2012 23:42

Todas as Respostas

  • Consegui Resolver assim. Adicionei a coluna com idEstudio da ultima movimentação e por ultimo fiz um INNER JOIN utilizando esse campo.

    Não sei se é a melhor opção, se alguem ainda tiver uma solução mais eficiente eu agradeço.

    SELECT 
    *,
    [Project1].[c1] AS UltimaEstudio
    FROM ( SELECT 
    *,
    (SELECT 
    TOP(1)[Extent2].idEstudio
    FROM [dbo].[EquipsMovs] AS [Extent2]
    WHERE [Extent1].[idEquip] = [Extent2].[idEquip] ORDER BY [Extent2].idEquipMov DESC ) AS [C1]
    FROM [dbo].[Equips] AS [Extent1]
    )  AS [Project1]
    INNER JOIN Estudios AS [Extent4] ON [Extent4].idEstudio = [Project1].C1


    • Editado Soró sábado, 6 de outubro de 2012 23:02
    • Marcado como Resposta Soró domingo, 7 de outubro de 2012 02:16
    • Não Marcado como Resposta Soró domingo, 7 de outubro de 2012 02:16
    sábado, 6 de outubro de 2012 23:01
  • Boa noite,

    Experimente desta forma:

    with CTE as
    (
        select 
            idEquip,
            idEstudio,
            ROW_NUMBER() OVER(PARTITION BY idEquip ORDER BY idEquipMov DESC) as RowNum
        from [dbo].[EquipsMovs]
    )
    
    select eq.*, es.*
    from [dbo].[Equips] as eq
    join CTE as c on c.idEquip = eq.idEquip and c.RowNum = 1
    join Estudios as es on es.idEstudio = c.idEstudio
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Soró domingo, 7 de outubro de 2012 02:18
    sábado, 6 de outubro de 2012 23:42
  • Vlw gapimex funcionou perfeitamente.
    domingo, 7 de outubro de 2012 02:19