选择子子中的最新记录

时间:2011-03-06 08:04:10

标签: sql sql-server join

我有以下表格/列:

Parent:
  ParentID

Child:
  ChildID
  ParentID

SubChild:
  SubChildID
  ChildID
  Date

ParentChild

有1对多的关系

ChildSubChild

有1对多的关系

对于每个Parent,我需要获取具有最新SubChild值的Date。 我怎么能用SQL做到这一点。我尝试过使用MAX(Date), 但我似乎无法弄清楚如何成功加入ParentChild

理想的结果集将包含与最新记录的所有Parent列相关联的所有SubChild

注意:使用 MS SQL 2005 +

4 个答案:

答案 0 :(得分:3)

查看使用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

答案 1 :(得分:2)

对于某些数据分发,这种方法可能会更快。

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  

答案 2 :(得分:0)

您可以使用相关子查询来执行此操作,但使用SQL Server 2005 ranking functions会更快。只要你知道你在做什么,那就是。

答案 3 :(得分:0)

为了简单起见,您可以进行子选择。在我的测试中,它具有与“交叉应用”方法相同的性能:

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(Sorted descending)和Display列。这会使查询在47k记录上不到1秒。