Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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_Tsql_Sql Server 2000 - Fatal编程技术网

Sql 如何加入“最新”记录?

Sql 如何加入“最新”记录?,sql,tsql,sql-server-2000,Sql,Tsql,Sql Server 2000,在SQLServer2000数据库中,有两个表通过父子关系连接。在子数据库中,唯一键由父id和日期戳组成 我需要对这些表进行联接,以便只联接每个子表的最新条目 有人能给我一些建议吗?这是我找到的最优化的方法。我对几种结构进行了测试,与其他方法相比,这种方法具有最低的IO 此示例将获得文章的最后一次修订 SELECT t.* FROM ARTICLES AS t --Join the the most recent history entries INNER JOIN R

在SQLServer2000数据库中,有两个表通过父子关系连接。在子数据库中,唯一键由父id和日期戳组成

我需要对这些表进行联接,以便只联接每个子表的最新条目


有人能给我一些建议吗?

这是我找到的最优化的方法。我对几种结构进行了测试,与其他方法相比,这种方法具有最低的IO

此示例将获得文章的最后一次修订

SELECT t.*
FROM ARTICLES AS t
    --Join the the most recent history entries
        INNER JOIN  REVISION lastHis ON t.ID = lastHis.FK_ID
        --limits to the last history in the WHERE statement
            LEFT JOIN REVISION his2 on lastHis.FK_ID = his2.FK_ID and lastHis.CREATED_TIME < his2.CREATED_TIME
WHERE his2.ID is null

如果您有一个表,其中只包含每个父项的最新条目和父项的id,那么这将很容易,对吗

您可以通过将子表连接到表本身来创建这样的表,只获取每个父id的最大日期戳。类似于此,您的SQL方言可能会有所不同:

   SELECT t1.*
     FROM child AS t1
LEFT JOIN child AS t2
       ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
    WHERE t2.datestamp IS NULL
这将获取该父id的子表中不存在更高时间戳的所有行。您可以在子查询中使用该表连接到:

   SELECT *
     FROM parent
     JOIN ( SELECT t1.*
              FROM child AS t1
         LEFT JOIN child AS t2
                ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
             WHERE t2.datestamp IS NULL ) AS most_recent_children
       ON (parent.id = most_recent_children.parent_id
或将父表直接连接到其中:

   SELECT parent.*, t1.*
     FROM parent
     JOIN child AS t1
       ON (parent.id = child.parent_id)
LEFT JOIN child AS t2
       ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
    WHERE t2.datestamp IS NULL
使用此查询作为基础 请注意,CTE定义不是查询的一部分,因此解决方案很简单

use test;
with parent as (
select 123 pid union all select 567 union all
select 125 union all 
select 789),
child as(
select 123 pid,CAST('1/12/2010' as DATE) stdt union all
select 123 ,CAST('1/15/2010' AS DATE) union all
select 567 ,CAST('5/12/2010' AS DATE) union all
select 567 ,CAST('6/15/2010' AS DATE) union all
select 125 ,CAST('4/15/2010' AS DATE) 
)
select pid,stdt from(
select a.pid,b.stdt,ROW_NUMBER() over(partition by a.pid order by b.stdt desc) selector
from parent as a
left outer join child as b
on a.pid=b.pid) as x
where x.selector=1

谢谢你,这对我来说已经很好了。我很高兴我能把它传下去。在^2上。请检查行号解决方案,以了解其复杂性。无法在SQL Server 2000数据库中使用行号,因此这没有帮助。@wqw您可能希望在扣分之前检查标记。同样,不能在SQL Server 2000中使用此解决方案