SQL Server - 使用DISTINCT进行内部联接

时间:2011-12-19 20:42:39

标签: sql 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上进行连接,但仅针对不同的值。

6 个答案:

答案 0 :(得分:12)

试试这个:

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 :(得分:5)

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   

答案 2 :(得分: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 :(得分:1)

在“选择”之后添加“distinct”。

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 :(得分:1)

您可以使用CTE获取第二个表的不同值,然后将其与第一个表连接。 您还需要根据LastName列获取不同的值。您可以使用由LastName分区的Row_Number()执行此操作,并按FirstName排序。

这是代码

;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

答案 5 :(得分:1)

选择不同的a.FirstName,a.LastName,v.District 来自AddTbl a   内连接ValTbl v   在a.LastName = v.LastName上 由a.FirstName订购;

希望这会有所帮助