Подтвердить что ты не робот

SQL Server - INNER JOIN WITH DISTINCT

Мне сложно делать следующее:

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, но только для разных значений.

4b9b3361

Ответ 1

Попробуйте следующее:

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;

Ответ 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

добавить "отличную" после "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

Ответ 4

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   

Ответ 5

Вы можете использовать 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