如何加入“最新”记录?

Ben*_*ter 6 sql t-sql sql-server-2000

我在 SQL Server 2000 数据库中有两个表,通过父子关系连接起来。在子数据库中,唯一键由父 ID 和日期戳组成。

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

谁能给我任何提示我该如何解决这个问题?

Lar*_*mie 7

这是我发现的最优化的方法。我针对多种结构对其进行了测试,与其他方法相比,这种方式的 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
Run Code Online (Sandbox Code Playgroud)

  • 无法在 SQL Server 2000 数据库中使用 Row_Number(),因此这没有帮助。 (2认同)

Ian*_*and 6

如果您有一个表,其中仅包含每个父级的最新条目以及父级的 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
Run Code Online (Sandbox Code Playgroud)

这将为您提供子表中对于该父 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
Run Code Online (Sandbox Code Playgroud)

或者直接将父表加入其中:

   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
Run Code Online (Sandbox Code Playgroud)