在子查询中将子查询与多个关联行相连接

时间:2013-01-27 19:19:39

标签: sql postgresql

我有一个选择一组用户的查询。每个用户都可以拥有一个号码 与之相关的事件。我想加入每个用户最早的活动 与该用户关联(每个用户产生一行),并在单个查询中执行此操作。

所以,我有点想这样做:

SELECT * FROM users
  left join (
    select * from events where events.user_id = users.id
    order by start_time limit 1) as event
    ON ("event"."user_id" = "users"."id")

但在联接选择中引用“用户”是违法的。

2 个答案:

答案 0 :(得分:2)

您可以使用子查询获取每个min(start_time)的{​​{1}}。然后,您将使用此结果连接回user_id表以获取min事件的详细信息:

events

如果您使用的数据库能够应用SELECT * FROM users u LEFT JOIN ( SELECT Min(start_time) Min_Start, user_id FROM events GROUP BY user_id ) e1 ON u.id = e1.user_id LEFT JOIN events e2 ON e1.user_id = e2.user_id AND e1.min_start = e2.start_time ,那么您可以使用以下内容:

row_number()

答案 1 :(得分:1)

在大多数数据库中,您可以使用row_number()

SELECT *
FROM users u left join
     (select e.*, row_number() over (partition by e.user_id order by start_time) seqnum
      from events e
     ) e
     on e.user_id = u.id

MySQL和MS Access不支持此功能,但大多数其他数据库都支持(并且您没有指定您正在使用的数据库)。