Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择子项中最近的记录_Sql_Sql Server_Join - Fatal编程技术网

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秒以内