【问题标题】:Select Top row of 2nd table in SQL Join在 SQL 连接中选择第二个表的第一行
【发布时间】:2012-01-30 17:39:50
【问题描述】:

我必须使用名为 USERSCOMM_HISTORY 的表

USERS(user_id, name)
COMM_HISTORY(comm_history_id, comm_date, comm_by, user_id)

USERS 表将有一个唯一的用户列表,COMM_HISTORY 可以有 user_id 的重复项。当我加入他们时,我想从COMM_HISTORY 获取用户名和最新的comm_date

sql join - only select top row from 2nd table 这篇帖子类似,但该帖子中似乎没有正确答案。

我想加入他们时得到 ff 结果

1 John Doe 2012-01-29 Jane Doe

代替

1 John Doe 2011-10-20 Jane Lee
2 John Doe 2012-01-29 Jane Doe
3 John Doe 2011-09-08 Jane Doe

有人有解决办法吗?

【问题讨论】:

  • 什么数据库和哪个版本? SQL 只是结构化查询语言 - 许多数据库系统使用的一种语言 - SQL 不是 数据库产品...这样的东西通常是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统......

标签: sql join


【解决方案1】:

@Andomar 在另一个问题中的解决方案应该有效。适应您的用例,它将是:

SELECT USERS.*, COMM_HISTORY.*
FROM USERS
INNER JOIN COMM_HISTORY
  ON USERS.user_id = COMM_HISTORY.user_id 
LEFT JOIN COMM_HISTORY LATER_HISTORY
  ON COMM_HISTORY.user_id = LATER_HISTORY.user_id 
  AND LATER_HISTORY.comm_date > COMM_HISTORY.comm_date
WHERE LATER_HISTORY.user_id IS NULL

将历史表重新加入自身,并设置一个条件,即不应选择以后的历史行。

【讨论】:

    【解决方案2】:

    使用 cte 的方法

    with recent_comms as (
    select 
       row_number() over (partition by user_id, order by comm_date decs) as rn,
       comm_date,
       comm_by, 
       user_id 
    FROM comm_history)
    
    select 
       users.name, 
       recent_comms.comm_date, 
       recent_comms.comm_by
    from users
    join recent_comms on users.user_id = recent_comms.user_id
    and recent_comms.rn = 1
    

    例如,将 rn = 1 更改为 rn

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多