首页 > 解决方案 > 在左连接中从外部表中选择单行

问题描述

我想获取外键匹配的第一行。我不知道如何选择外键匹配的第一行

事件表

id   |  name 
----------------
 1   |  john
----------------
 2  |  Cat

event_attendee 表

id   |  event_id | type
--------------------------
 1   |  1        | User
--------------------------
 2   |  1        | Local
--------------------------
 3   |  1        | User
--------------------------
 4   |  2        | User
--------------------------
 5   |  2        | User

我想要这个结果

id   |  name    | event_id | type
------------------------------------
 1   |  John    | 1        | User
------------------------------------
 2   |  Cat     | 2        | User   

试过了

select
a.*,
b.*
from
events as a
left join (
select
distinct
event_attendee.events_id,
event_attendee.type
from
event_attendee
left join events on
event_attendees.events_id = events.id
where
events.id = event_attendees.events_id
limit 1 

) as b on
a.id = b.events_id

问题

它仅适用于第一行,第二行显示为空

id   |  name    | type
------------------------------------
 1   |  John    | User
------------------------------------
 2   |  Cat     |  

标签: sqlpostgresqljoin

解决方案


您可以使用横向连接来执行此操作。在 Postgres 中,语法是:

select e.*, ea.*
from events e left join lateral
     (select ea.event_Id, ea.Type
      from event_attendee ea
      where ea.event_id = e.id
      order by ea.id
     ) ea
     on 1=1;

但是,distinct on这是一种没有子查询的方法:

select distinct on (e.event_id) e.*, ea.*
from events e join
     event_attendee ea
     on ea.event_id = e.id
order by e.event_id, ea.id;

我希望横向连接在更大的表上工作得更好,特别是在使用正确索引的情况下。


推荐阅读