2011-12-19 12 views
13

Estoy teniendo dificultades para hacer lo siguiente:SQL Server - INNER JOIN CON DISTINTO

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) 

Quiero hacer una combinación en ValTbl pero sólo para valores distintos.

Respuesta

10

Prueba esto:

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

O esto (que hace lo mismo, pero la sintaxis es diferente):

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

agregar "distinct" después de "seleccionar".

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 
2

No es lo mismo hacer un selecto distinta al comienzo porque está desperdiciando todas las filas calculadas del 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) 

intenta eso.

+3

'NATURAL JOIN' es' sintaxis incorrecta 'en MSSQL 2008 R1 – itsho

0

Puede usar CTE para obtener los valores distintivos de la segunda tabla, y luego unir eso con la primera tabla. También necesita obtener los valores distintos basados ​​en la columna Apellido. Haga esto con Row_Number() particionado por LastName y ordenado por FirstName.

Aquí está el 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

Nate, creo que en realidad se ha proporcionado un buen comienzo para la respuesta correcta a la derecha en su pregunta (sólo tiene la sintaxis correcta). Tenía exactamente el mismo problema, y ​​poner DISTINCT en una sub consulta era de hecho menos costoso que lo que otras respuestas aquí han propuesto.

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