sql - 如何编写用于以下的 sql 选择查询
问题描述
我有以下表格
表一:人
columns: id,name,address,code
表 2:汽车详情
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)
解决方案
您应该使用聚合的子查询编写此查询:
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;
推荐阅读
- c# - 来自角色的反应 C#
- javascript - 等待图像的格式更改
- c# - 来自 nugets 的跨平台项目和数据类
- javascript - [Vue警告]:
只能用于单个元素。利用 对于列表 - php - openpgp-php 无法解密来自其他客户端的密文
- web-services - 通过 web 服务登录 prestashop 1.7
- python - 在执行当前脚本之前运行 python 脚本
- c# - V5R4 上 iSeries 的 .NET 数据提供程序
- ios - 2 架构 arm64 的重复符号
- apache-kafka - Kafka Streams:处理来自不同分区的消息时的事件时间偏差