web-dev-qa-db-fra.com

SQL Server - INNER JOIN WITH DISTINCT

J'ai de la difficulté à faire ce qui suit:

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)  

Je veux faire une jointure sur ValTbl mais uniquement pour des valeurs distinctes. 

16
Nate Pet

Essaye ça:

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 ceci (cela fait la même chose, mais la syntaxe est différente):

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 , je pense que vous avez bien fourni le bon début pour la bonne réponse, juste dans votre question (vous avez juste besoin de la bonne syntaxe). J'ai eu exactement le même problème, et mettre DISTINCT dans une sous-requête était en effet moins coûteux que ce que d'autres réponses proposées ici ont proposé. 

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

Ce n'est pas la même chose de faire une sélection distincte au début car vous gaspillez toutes les lignes calculées du résultat.

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)

essayez ça.

2
AlfredoVR

ajouter "distinct" après "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

Vous pouvez utiliser CTE pour obtenir les valeurs distinctes de la deuxième table, puis l'associer à la première table. Vous devez également obtenir les valeurs distinctes basées sur la colonne LastName. Vous faites cela avec un Row_Number () partitionné par LastName et trié par FirstName.

Voici le code

;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

sélectionnez distinct a.FirstName, a.LastName, v.District from AddTbl a jointure interne ValTbl v sur a.LastName = v.LastName ordonné par a.FirstName;

j'espère que cela t'aides

0
Monwabisi Labeanzo