【问题标题】:SQL Server - INNER JOIN WITH DISTINCTSQL 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 上进行连接,但只针对不同的值。

【问题讨论】:

    标签: sql inner-join


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2016-12-23
          • 1970-01-01
          • 1970-01-01
          • 2013-11-11
          • 2016-04-28
          • 2012-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多