这可能很简单,但我正在寻找原始 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 中会转换成什么?
最佳答案
有两种方法可以做到这一点:
使用
GROUP BY
和MAX()
: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
使用
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/