SQL Server - INNER JOIN WITH DISTINCT

Posted

技术标签:

【中文标题】SQL Server - INNER JOIN WITH DISTINCT【英文标题】: 【发布时间】:2012-01-23 22:26:17 【问题描述】:

我很难做到以下几点:

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】:

我认为您实际上为您的问题中的正确答案提供了一个良好的开端(您只需要正确的语法)。我遇到了同样的问题,将 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   

【讨论】:

这对我来说似乎是正确的答案。接受的答案是在查询运行后对所有内容都执行不同的操作(从性能角度来看这很糟糕),但 OP 只希望 ValTbl 是不同的,他并没有说他也希望删除 AddTbl 中的重复记录。跨度> 【参考方案2】:

选择不同的 a.FirstName、a.LastName、v.District 来自 AddTbl a 内连接 ValTbl v 在 a.LastName = v.LastName 按 a.FirstName 排序;

希望对你有帮助

【讨论】:

这个问题是在 6 年前提出的——他们可能不再需要那个答案了 :-)【参考方案3】:

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

这是代码

;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

【讨论】:

【参考方案4】:

在开始时执行 select distinct 是不一样的,因为您浪费了结果中的所有计算行。

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)

试试看。

【讨论】:

NATURAL JOIN 在 MSSQL 2008 R1 中是 incorrect syntax【参考方案5】:

试试这个:

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;

【讨论】:

【参考方案6】:

在“select”之后添加“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

【讨论】:

以上是关于SQL Server - INNER JOIN WITH DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章

sql server join ,inner join ,left join ,right join 的使用

SQL Server - INNER JOIN WITH DISTINCT

使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]

Sql Server 与 MySql 在使用 update inner join 时的区别

如何在 SQL Server 中使用 INNER JOIN 从多个表中删除

SQL Server-聚焦INNER JOIN AND IN性能分析(十四)