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中转化为什么?
您可以使用聚合查询连接第一个表:
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)
有两种方法可以做到这一点:
使用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
Run Code Online (Sandbox Code Playgroud)使用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)| 归档时间: |
|
| 查看次数: |
3967 次 |
| 最近记录: |