2011-12-19 11 views
13

Я с трудом, выполнив следующие действия:SQL Server - INNER JOIN с отчетливым

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) 

Я хочу сделать присоединиться на ValTbl, но только для различных значений.

ответ

10

Попробуйте это:

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

Или это (он делает то же самое, но синтаксис отличается):

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

добавить «отличную» после «выбрать».

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

Это не то же самое делает отборное различны в начале потому что вы тратите все расчетные строки из результата.

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) 

попробуйте это.

+3

'NATURAL JOIN' является' неправильным синтаксисом' в MSSQL 2008 R1 – itsho

0

Вы можете использовать CTE для получения различных значений второй таблицы, а затем присоединиться к этой первой таблице. Вам также нужно получить различные значения на основе столбца LastName. Вы делаете это с помощью Row_Number(), разделенного по LastName и отсортированного по первому имени.

Вот код

;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, я думаю, что вы на самом деле при условии хорошего старта для правильного ответа прямо в вашем вопросе (нужно просто правильный синтаксис). У меня была такая же проблема, и включение DISTINCT в подзапрос было действительно менее дорогостоящим, чем предлагаемые здесь другие ответы.

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