SQL:内部联接根据条件返回一行

标签 sql sql-server linq select inner-join

这可能很简单,但我正在寻找原始 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 中会转换成什么?

最佳答案

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

  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
    

关于SQL:内部联接根据条件返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726059/

相关文章:

SQL - 来自同一子查询的多个 where in 子句?

mysql - 有 2 个外键的表来自一个主表

sql-server - 休眠/SQL Server : default lock mode

c# - 如何在不在服务器上安装 SSIS 的情况下在 C# 应用程序中使用 SSIS 包,这可能吗?

c# - IObservable<T> 使用 linq 查询

php - Sql连接查询返回未指定字段值的记录

php - 获取行,其中天等于某个值

sql-server - 在 SQL Server 中将金额分布到多行

c# - 使用分隔符连接多个字符串

c# - 在 C# 中使用 LINQ 读取 Xml 文件