Sql 选择子项中最近的记录
我有以下表格/列:Sql 选择子项中最近的记录,sql,sql-server,join,Sql,Sql Server,Join,我有以下表格/列: Parent: ParentID Child: ChildID ParentID SubChild: SubChildID ChildID Date Parent与Child Child与SubChild 对于每一个家长,我都需要使用最新的日期值获取子孩子。 如何使用SQL实现这一点。我试过使用MAX(Date), 但我似乎不知道如何成功地加入家长和孩子 理想的结果集将包含与最新记录的所有SubChild列关联的所有Parents 注意:使用MS
Parent:
ParentID
Child:
ChildID
ParentID
SubChild:
SubChildID
ChildID
Date
Parent
与Child
Child
与SubChild
对于每一个家长
,我都需要使用最新的日期
值获取子孩子
。
如何使用SQL实现这一点。我试过使用MAX(Date)
,
但我似乎不知道如何成功地加入家长
和孩子
理想的结果集将包含与最新记录的所有SubChild
列关联的所有Parent
s
注意:使用MS SQL 2005+可以使用相关子查询执行此操作,但使用SQL Server 2005更快。只要你知道自己在做什么,那就是。看看如何使用 差不多
;WITH Vals AS (
SELECT p.ParentID,
sc.SubChildID,
ROW_NUMBER() OVER (PARTITION BY p.ParentID ORDER BY sc.[Date] DESC) RowID
FROM Parent p INNER JOIN
Child c ON p.ParentID = c.ParentID INNER JOIN
SubChild sc ON c.ChildID = sc.ChildID
)
SELECT ParentID,
SubChildID
FROM Vals
WHERE RowID = 1
对于某些数据分布,这种方法可能更快
SELECT p.ParentID,
sc.SubChildID,
sc.Date
FROM Parent p
CROSS APPLY (SELECT TOP(1) s.SubChildID,
s.Date
FROM SubChild s
JOIN Child c
ON c.ChildID = s.ChildID
WHERE c.ParentID=p.ParentID
ORDER BY s.Date DESC) sc
为了保持简单,您可以进行子选择。在我的测试中,这与“交叉应用”方法具有相同的性能:
select firstname, lastname,
(Select top 1 Display from _notes where _notes.ParentId = c.Id order by createdon desc) as MostRecentNote
from _contacts c
对于47k记录,这种“子选择”方法大约需要4秒钟。为了加快速度,我在_Notes上添加了一个排序索引,其中包括ParentId、CreatedOn(按降序排序)和Display列。这将使47k记录的查询时间缩短到1秒以内