选择连接结果作为列到同一行

时间:2018-12-03 19:14:22

标签: sql postgresql

我在pg数据库中有一对多关系。我有表A和表B,其中B的行具有A的外键。

我想从A中选择某些行,并将B的匹配行中的某些列附加到A的同一行中。

例如

      A
id | created_at |

      B
id | created_at | a_id | type |

我尝试执行多个子查询,例如

select A.id,
(select created_at from B where b.a_id = a.id and B.type = 'some_type' limit 1) as some_type_created_at,
(select created_at from B where b.a_id = a.id and B.type = 'another_type' limit 1) as another_type_created_at
from A

但是,这显然是丑陋和错误的。在Postgres中实现它的更好方法是什么?

当然,我可以加入并获得完整的笛卡尔积,但我希望数据库的结果直接像这样。

1 个答案:

答案 0 :(得分:1)

使用标量子查询的方式没有错。这样会很好用,并且会给您想要的结果。

或者,您可以使用横向表表达式;这样也会给您相同的结果,它会更复杂,在这种情况下,使用它们不会带来任何好处。横向查询将采用以下形式:

select
  a.id,
  b1.created_at as some_type_created_at,
  b2.created_at as another_type_created_at
from a
left join lateral (
  select created_at from B where b.a_id = a.id and B.type = 'some_type' limit 1
) b1 on true,
left join lateral (
  select created_at from B where b.a_id = a.id and B.type = 'another_type' limit 1
) b2 on true

总的来说,你是一个好人。