PostgreSQL多对多关系折叠:查询人员职位(唯一/多职位替换)
PostgreSQL 查询:根据人员职位数量返回对应结果
需求说明
现有三张表:people(人员表)、jobs(职位表)、people_to_jobs(人员-职位多对多关联表),需要编写查询语句实现:为每位人员返回其职位信息,若仅拥有唯一职位则显示该职位名称,若有多个职位则显示多个职位。
表结构
people 表
| person_id | person_name |
|---|---|
| 1 | Jack |
| 2 | Sarah |
| 3 | George |
jobs 表
| job_id | job_name |
|---|---|
| 1 | Accounting |
| 2 | Sales |
| 3 | Research |
people_to_jobs 表
| person_id | job_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 3 |
解决方案
可以通过分组统计职位数量,结合 CASE 条件判断来实现需求,SQL 语句如下:
SELECT p.person_id, p.person_name, CASE WHEN COUNT(pj.job_id) = 1 THEN MAX(j.job_name) ELSE '多个职位' END AS job_name FROM people p LEFT JOIN people_to_jobs pj ON p.person_id = pj.person_id LEFT JOIN jobs j ON pj.job_id = j.job_id GROUP BY p.person_id, p.person_name;
语句说明
- 关联表:通过
LEFT JOIN将人员表与关联表、职位表关联,确保所有人员都能被查询到; - 分组统计:按人员的
person_id和person_name分组,用COUNT(pj.job_id)统计每个人员的职位数量; - 条件判断:
- 若职位数量为1,用
MAX(j.job_name)获取唯一的职位名称(因分组后仅一条职位记录,MAX/ MIN/ SUM 均可); - 若职位数量大于1,直接返回多个职位。
- 若职位数量为1,用
查询结果
| person_id | person_name | job_name |
|---|---|---|
| 1 | Jack | Accounting |
| 2 | Sarah | 多个职位 |
| 3 | George | Research |
内容的提问来源于stack exchange,提问作者Andrew Plowright
相关产品推荐
相关产品推荐

