如何仅选择表格中的最新条目?

时间:2008-12-17 15:14:13

标签: sql sql-server

我有一个3表SQLServer数据库。

Project
ProjectID
ProjectName

Thing
ThingID
ThingName

ProjectThingLink
ProjectID
ThingID
CreatedDate

当Thing归于Project时,条目将放入ProjectThingLink表中。 事情可以在项目之间移动。 CreatedDate用于了解上次移动的项目。

我正在尝试创建一个列表,列出目前与之相关的所有项目,但我的大脑失败了。

有没有一种简单的方法可以做到这一点?

5 个答案:

答案 0 :(得分:2)

select p.projectName, t.ThingName
from projects p
join projectThingLink l on l.projectId = p.projectId
join thing t on t.thingId = l.thingId
where l.createdDate =
( select max(l2.createdDate)
  from projectThingLink l2
  where l2.thingId = l.thingId
);

注意:在评论后更正

答案 1 :(得分:2)

这几乎总能给你提供比子查询方法更好的性能。您基本上是在寻找没有任何其他行的行,而不是寻找具有最大日期的行:

SELECT
     P.ProjectID,
     P.ProjectName,
     T.ThingID,
     T.ThingName
FROM
     dbo.Projects P
INNER JOIN dbo.ProjectThingLinks PTL1 ON
     PTL1.ProjectID = P.ProjectID
LEFT OUTER JOIN dbo.ProjectThingLinks PTL2 ON
     PTL2.ProjectID = ThingID = PTL1.ThingID AND
     PTL2.CreatedDate > PTL1.CreatedDate
INNER JOIN dbo.Things T ON
     T.ThingID = PTL1.ThingID
WHERE
     PTL2.ThingID IS NULL

一旦您决定处理具有相同CreatedDate值的两行的业务规则,您可能需要调整查询。

另外,作为旁注,一个名为“Things”的表通常是数据库设计问题的一个好兆头。表应代表不同的现实生活实体。这种普遍性通常会导致将来出现问题。如果这些是资源,那么他们可能会分享某些名称以外的属性。也许你的情况是一个非常特殊的情况,但很可能不是。 ;)

答案 2 :(得分:1)

试试这个:

select p.ProjectID, p.Name, t.ThingID, t.ThingName, l.CreatedDate 
from Project p
inner join (
    select ProjectID, max(CreatedDate) as CreatedDate
    from ProjectThingLink
    group by ProjectID
) lm on p.ProjectID = l.ProjectID
inner join ProjectThingLink l on lm.ProjectID = l.ProjectID and lm.CreatedDate = l.CreatedDate
inner joing Thing t on l.ThingID = t.ThingID

答案 3 :(得分:0)

你可以简单地做

SELECT Project.projectId, Project.ProjectName, ThingName
FROM Project  INNER JOIN ProjectThingLink
 ON Project.ProjectID = ProjectThingLink.ProjectID INNER JOIN
                     Thing ON ProjectThingLink.ThingID = Thing.ThingID

将获得每个项目的列表,其中包含与之相关的所有内容:

1 | Project1 |东西

1 | Project1 | ThisThing

2 | Project2 | ThatThing

答案 4 :(得分:0)

select * from project
inner join (select projectid,
                   max(createdate) as maxdate 
            from projectThingLink 
            group by projectid) as a
on projectid = a.projectid  and createDate = a.maxDate