首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL根据第一个表的ID(键)从两个表中检索数据

SQL根据第一个表的ID(键)从两个表中检索数据
EN

Stack Overflow用户
提问于 2012-02-23 08:58:41
回答 3查看 894关注 0票数 3

我想这以前已经做过很多次了,但我无论如何也想不出来,我厌倦了尝试变通的方法。

我有两张桌子。

一个是具有ObjectID (关键字)、名称、类型、位置的对象,第二个是具有StatusID(关键字)、ObjectID、Status、DateChanged、UserWhoChangedStatus的ObjectStatus

我想要做的是返回所有对象和最后输入的ObjectStatus

表1对象

代码语言:javascript
复制
ObjectID      Name          Type      Location
   1         Blue Ball      Ball       ToyBox
   2         Red Ball       Ball       ToyBox

表2 (ObjectStatus)

代码语言:javascript
复制
StatusID    ObjectID    Status    DateChanged    UserWhoChangedStatus
   1          2         Broken    2012-01-25       56481
   2          2         Fixed     2012-01-30       98526
   3          1         Bouncy    2012-01-05       85245
   4          1         Sticky    2012-02-10       56481

我会想要得到回报

代码语言:javascript
复制
ObjectID Name      Type Location StatusID Status DateChanged UserWhoChangedStatus
   1     Blue Ball Ball ToyBox       4    Sticky 2012-02-10  56481
   2     RedBall   Ball ToyBox       2    Fixed  2012-01-30  98526

,它是所有对象和最后输入的ObjectStatus

EN

Stack Overflow用户

发布于 2012-02-23 09:43:13

只是为了提供另一种解决方案,以便将来的读者可以比较性能,并根据自己的情况选择合适的方法。

代码语言:javascript
复制
;WITH LastChange AS
(
  SELECT 
    ObjectID, Status, DateChanged, UserWhoChangedStatus,
      rn = ROW_NUMBER() OVER (PARTITION BY ObjectID ORDER BY DateChanged DESC)
    FROM dbo.ObjectStatus
)
SELECT 
  o.ObjectID, o.Name, o.Type, o.Location,
  l.StatusID, l.Status, l.DateChanged, l.UserWhoChangedStatus
FROM dbo.Object AS o
LEFT OUTER JOIN LastChange AS l
ON o.ObjectID = l.ObjectID
AND l.rn = 1;

如果您以某种方式知道状态表对于每个ObjectID总是至少有一行,或者如果您不想返回状态中没有行的对象,则可以将LEFT OUTER JOIN更改为INNER JOIN

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9405627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档