Как написать запрос выбора SQL для следующих - PullRequest
0 голосов
/ 02 июня 2018

У меня есть следующие таблицы

Таблица 1: персона

columns: id,name,address,code

Таблица 2: carDetails

columns: id,person_id,car_brand
constraints: FL==>carDetails(person_id) reference person(id)
Note: carDetails is having multiple details for single person

Таблица 3: mobileDetails

columns: id,person_id,mobile_brand
constraints: FL==>mobileDetails(person_id) reference person(id)
Note: mobileDetails is having multiple details for single person

Точно так же у меня есть много деталей, таких как автомобиль и мобильный телефон для человека

То, что я хочу выбрать:

person(id),
person(name),
Array of carDetails(brand) belonging to that particular person(id)
Array of mobileDetails(brand) belonging to that particular person(id)

1 Ответ

0 голосов
/ 02 июня 2018

Вы должны написать этот запрос, используя подзапросы для агрегации:

select p.*, c.car_brands, m.mobile_brands
from person p left join
     (select c.person_id, array_agg(cd.car_brand) as car_brands
      from car_details c
      group by c.person_id
     ) c
     on c.person_id = p.id left join
     (select m.person_id, array_agg(m.mobile_brand) as mobile_brands
      from mobile_details m
      group by m.person_id
     ) m
     on m.person_id = m.id;

Два примечания:

  • Вы хотите использовать left join, если у вас нет данных водна из таблиц для некоторых людей.
  • Вы хотите объединить до объединения , чтобы избежать дублирования.Хотя вы можете добавить distinct к array_agg(), что влечет за собой снижение производительности.

Если вы фильтруете людей, это часто более эффективно сделать с использованием подзапроса или (эквивалентно) в качестве боковогоприсоединиться:

select p.*,
       (select array_agg(cd.car_brand) as car_brands
        from car_details c
        where c.person_id = p.id
       ) as car_brands,
       (select array_agg(m.mobile_brand) as mobile_brands
        from mobile_details m
        where m.person_id = p.id
       ) as mobile_brands
from person p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...