【问题标题】:SQL: Inner Join return one row based on criteriaSQL:内部联接根据条件返回一行
【发布时间】:2014-12-31 20:30:27
【问题描述】:

这可能很简单,但我正在寻找原始 SQL 以执行 INNER JOIN 但仅根据条件返回第二个表上的匹配项之一。

给定两个表:

**TableOne**   
 ID  Name  
 1   abc  
 2   def

**TableTwo**  
 ID    Date     
 1     12/1/2014
 1     12/2/2014
 2     12/3/2014
 2     12/4/2014
 2     12/5/2014

我想加入但只返回第二张表的最新日期:

Expected Result:
1   abc   12/2/2014
2   def   12/5/2014

我可以像这样在 LINQ 中轻松完成此操作:

TableOne.Select(x=> new { x.ID, x.Name, Date = x.TableTwo.Max(y=>y.Date) });

也就是说,上面的 LINQ 语句在原始 SQL 中翻译成什么?

【问题讨论】:

    标签: sql sql-server linq select inner-join


    【解决方案1】:

    有两种方法可以做到这一点:

    1. 使用GROUP BYMAX()

      SELECT one.ID,
             one.Name,
             MAX(two.Date)
          FROM TableOne one
              INNER JOIN TableTwo two on one.ID = two.ID
          GROUP BY one.ID, one.Name
      
    2. ROW_NUMBER() 与 CTE 一起使用:

      ; WITH cte AS (
          SELECT one.ID,
             one.Name,
             two.Date,
             ROW_NUMBER() OVER (PARTITION BY one.ID ORDER BY two.Date DESC) as rn
          FROM TableOne one
             INNER JOIN TableTwo two ON one.ID = two.ID
      )
          SELECT ID, Name, Date FROM cte WHERE rn = 1
      

    【讨论】:

      【解决方案2】:

      您可以使用聚合查询连接第一个表:

      SELECT t1.id, d
      FROM   TableOne t1
      JOIN   (SELECT   id, MAX[date] AS d
              FROM     TableTwo
              GROUP BY id) t2 ON t1.id = t2.id
      

      【讨论】:

        【解决方案3】:

        类似:

        SELECT TableOne.id, TableOne.name, MAX(TableTwo.Date)
        FROM TableOne
        LEFT JOIN TableTwo ON TableOne.id = TableTwo.id
        GROUP BY TableOne.id, TableOne.name;
        

        联接将生成一个包含与 TableTwo 一样多的行的表,但 group by 会将其过滤为 TableOne 的每行中的一行。

        【讨论】:

        • 我相信using 在 SQL Server 中不起作用,它是 MySQL 特有的
        【解决方案4】:

        由于没有其他人介绍过可以执行您想要的任务的公用表表达式 (CTE),我将把它放在这里:

        with maxDates as (
            select Id, max(Date)
            from Table2
            group by Id
        )
        select x.Id, x.Name, y.Date
        from TableOne x
        inner join maxDates y
        on x.Id = y.id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-24
          • 1970-01-01
          • 1970-01-01
          • 2014-08-20
          • 2021-08-22
          相关资源
          最近更新 更多