SQL:Inner Join根据条件返回一行

ste*_*n34 4 sql linq sql-server 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
Run Code Online (Sandbox Code Playgroud)

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

Expected Result:
1   abc   12/2/2014
2   def   12/5/2014
Run Code Online (Sandbox Code Playgroud)

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

TableOne.Select(x=> new { x.ID, x.Name, Date = x.TableTwo.Max(y=>y.Date) });
Run Code Online (Sandbox Code Playgroud)

换句话说,上面的LINQ语句在原始SQL中转化为什么?

Mur*_*nik 5

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

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
Run Code Online (Sandbox Code Playgroud)


Rhu*_*orl 5

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

  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)