it-swarm-pt.tech

SQL Server - INNER JOIN COM DISTINCT

Eu estou tendo dificuldade em fazer o seguinte:

select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
inner join (select distinct LastName from
            ValTbl v  where a.LastName = v.LastName)  

Eu quero fazer uma junção no ValTbl, mas apenas para valores distintos. 

16
Nate Pet

Tente isto:

select distinct a.FirstName, a.LastName, v.District
from AddTbl a 
  inner join ValTbl v
  on a.LastName = v.LastName
order by a.FirstName;

Ou isso (faz o mesmo, mas a sintaxe é diferente):

select distinct a.FirstName, a.LastName, v.District
from AddTbl a, ValTbl v
where a.LastName = v.LastName
order by a.FirstName;
12
kol

Nate , eu acho que você realmente forneceu um bom começo para a resposta correta em sua pergunta (você só precisa da sintaxe correta). Eu tive exatamente esse mesmo problema, e colocar DISTINCT em uma subconsulta foi de fato menos custoso do que outras respostas aqui propostas. 

select a.FirstName, a.LastName, v.District
from AddTbl a 
inner join (select distinct LastName, District 
    from ValTbl) v
   on a.LastName = v.LastName
order by Firstname   
4
Denis M. Kitchen

Não é o mesmo fazer um select distinto no começo porque você está perdendo todas as linhas calculadas do resultado.

select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
natural join (select distinct LastName from
            ValTbl v  where a.LastName = v.LastName)

tente isso.

2
AlfredoVR

adicione "distinct" depois de "select".

select distinct a.FirstName, a.LastName, v.District , v.LastName
from AddTbl a 
inner join ValTbl v  where a.LastName = v.LastName  order by Firstname
1
Chris Brickhouse

Você pode usar o CTE para obter os valores distintos da segunda tabela e, em seguida, associá-los à primeira tabela. Você também precisa obter os valores distintos com base na coluna LastName. Você faz isso com um Row_Number () particionado pelo LastName e classificado pelo FirstName.

Aqui está o código

;WITH SecondTableWithDistinctLastName AS
(
        SELECT  *
        FROM    (
                    SELECT  *,
                            ROW_NUMBER() OVER (PARTITION BY LastName ORDER BY FirstName) AS [Rank]
                    FROM    AddTbl
                )   
        AS      tableWithRank
        WHERE   tableWithRank.[Rank] = 1
) 
SELECT          a.FirstName, a.LastName, S.District
FROM            SecondTableWithDistinctLastName AS S
INNER JOIN      AddTbl AS a
    ON          a.LastName = S.LastName
ORDER   BY      a.FirstName
1
Sadra Abedinzadeh

selecione distinto a.FirstName, a.LastName, v.District de AddTbl a junção interna ValTbl v em a.LastName = v.LastName order by a.FirstName;

espero que isto ajude

0
Monwabisi Labeanzo