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