我在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中实现它的更好方法是什么?
当然,我可以加入并获得完整的笛卡尔积,但我希望数据库的结果直接像这样。
答案 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
总的来说,你是一个好人。