выберите результат объединения в виде столбцов в одной строке - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть отношение один ко многим в базе данных 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?

Конечно, я могу присоединиться и получить полный декартовой продукт, но я хочу, чтобы результат из db был прямо таким:

1 Ответ

0 голосов
/ 03 декабря 2018

Нет ничего плохого в использовании скалярных подзапросов так, как вы это делаете.Это будет хорошо работать и даст вам желаемый результат.

В качестве альтернативы, вы можете использовать выражения боковой таблицы;это также даст вам тот же результат, он более сложный, и в этом случае я не вижу особой пользы от их использования.Боковые запросы будут иметь вид:

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

В сумме, вы хороши как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...