子孩子选择最近的记录

问题描述:

我有以下表/列:子孩子选择最近的记录

Parent: 
    ParentID 

Child: 
    ChildID 
    ParentID 

SubChild: 
    SubChildID 
    ChildID 
    Date 

Parent有1与Child

Child有1一对多的关系,以一对多的关系与SubChild

对于每Parent,我需要得到SubChild与最新的Date值。 我该如何使用SQL来做到这一点。我试过使用MAX(Date), ,但我似乎无法弄清楚如何成功加入ParentChild

理想的结果集将包含所有Parent s加入所有最新记录的SubChild列。

注意:在使用MS SQL 2005+

看一看使用ROW_NUMBER

喜欢的东西

;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 

为此,您可以使用相关子查询,但它是更快地使用SQL Server 2005 ranking functions。只要你知道你在做什么,就是这样。

对于一些数据分布这种方法可能会更快。

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(降序排列)和显示列被包括在内)。这将47k记录中的查询时间降低到1秒以内。