SQL以获取每个用户的最新记录

时间:2011-12-05 19:13:24

标签: sql

试着想一想如何概括我的问题,却想不出什么(也许是为什么谷歌搜索还没有提供解决方案)。

所以我根据USERS表和COMMENTS表提出我的问题,我想为每个用户 获取最新的COMMENT

用户

| ID | NAME |
-------------
| 01 | BOB  |
-------------
| 02 | JEN  |
-------------

评论

| EMP_ID | UPDATED    |
-----------------------
| 01     | 12/05/2011 |   <== I WANT THIS
-----------------------
| 01     | 11/29/2011 |
-----------------------
| 02     | 12/01/2011 |   <== ...AND THIS
-----------------------
| 02     | 11/27/2011 |

我尝试过这样的事情......

select e.date from USERS u 
join EMPLOYEES e on e.emp_id=u.id 
where emp_id in (select emp_id from TIMESHEETS where emp_id=u.id order by date fetch first 1 row only)

......它有效,但速度非常慢。

(我们正在使用DB2,因此我可以使用Common Tables)

2 个答案:

答案 0 :(得分:1)

select u.name
     , u.id
     , c.text
     , c.updated
  from users u
left
  join ( select cm.emp_id
              , max(cm.updated) mostRecentCommentDate
           from comments cm
          group
             by cm.emp_id ) recentComments
    on  recentComments.emp_id = u.id
left
  join comments c
    on c.emp_id = u.id
   and c.updated = recentComments.mostRecentCommentDate

此处存在的一个潜在问题是,当用户在最近的评论当天有多个评论时。它可以解决,但您需要提供如何确定所需行的标准。上述查询将为最近评论日期的每条评论添加一行。太糟糕了,它不是日期时间字段......

答案 1 :(得分:0)

再次感谢Chris - 我考虑过你的方法,但最后我再次看到了我在原始SQL中所采用的方法。我在问题中包含的SQL大大简化了。实际上我有三个连接和相当大的where子句。

我发现相关的子查询方法实际上非常快,当我小心我的where子句时,当我确定子查询与外部查询相关的位置时,它在结果集上做了很多通过过滤减少。