我有以下表格
表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)
答案 0 :(得分:1)
您应该使用聚合的子查询来编写此查询:
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;