如何编写sql select查询以供查看

时间:2018-06-02 10:06:59

标签: sql postgresql

我有以下表格

表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 :(得分: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;