2011-12-19 27 views
13

Mam twardy czas w następujący sposób:SQL Server - INNER JOIN z wyraźnymi

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) 

chcę zrobić sprzężenia na ValTbl ale tylko dla różnych wartości.

Odpowiedz

10

Spróbuj tego:

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

Albo ten (robi to samo, ale składnia jest inna):

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

dodaj "wyraźny" po "wybierz".

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

To nie to samo robi select distinct na początku ponieważ marnujesz wszystkie obliczone wiersze od wyniku.

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) 

wypróbuj to.

+3

'NATURALNA JOIN' to" niepoprawna składnia "w MSSQL 2008 R1 – itsho

0

Możesz użyć CTE, aby uzyskać różne wartości drugiej tabeli, a następnie połączyć ją z pierwszą tabelą. Należy również uzyskać różne wartości na podstawie kolumny LastName. Robisz to z Row_Number() podzielonym na partycje przez LastName i sortowane według FirstName.

Oto kod

;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, myślę, że faktycznie zapewniał dobry początek dla poprawnej odpowiedzi w prawo w swoim pytaniu (wystarczy poprawnej składni). Miałem dokładnie ten sam problem i umieszczenie DISTINCT w pod-zapytaniu było rzeczywiście mniej kosztowne, niż proponowały inne odpowiedzi.

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