单SQLSELECT查询一对多关系
Single SQL SELECT query for one to many relationship
这个问题没有例子很难解释。
我有2个table,公司和员工,他们是一对多的关系,一个公司可以参加很多员工。
此处显示最简单的 table 结构
Company
| id | name |
Employee
| id | name | company_id | join_date |
现在的问题是:
我如何 select 前 2 名员工并将他们的入职日期显示为公司 table 的列?
所以结果是这样的
| id | company_name | first_employee_join_at | second_employee_join_at |
假设employee
中有一个外键列company_id
table:
with emps as (
select id, name, company_id,
row_number() over (partition by company_id order by join_date) as rn
from employee
)
select c.id, c.name as company_name,
e1.join_date as first_employee_join_at,
e2.join_date as second_employee_join_at
from company c
left join emps e1 on e1.company_id = c.id and e1.rn = 1
left join emps e2 on e2.company_id = c.id and e2.rn = 2;
虽然这不会非常有效。稍微更有效的版本将使用条件聚合:
with emps as (
select id, name, company_id,
row_number() over (partition by company_id order by join_date) as rn
from employee
)
select c.id, c.name as company_name,
max(e.join_date) filter (where rn = 1) as first_employee_join_at,
max(e.join_date) filter (where rn = 2) as second_employee_join_at
from company c
join emps e on e.company_id = c.id and e.rn in (1,2)
group by c.id, c.name;
这个问题没有例子很难解释。
我有2个table,公司和员工,他们是一对多的关系,一个公司可以参加很多员工。
此处显示最简单的 table 结构
Company
| id | name |
Employee
| id | name | company_id | join_date |
现在的问题是:
我如何 select 前 2 名员工并将他们的入职日期显示为公司 table 的列?
所以结果是这样的
| id | company_name | first_employee_join_at | second_employee_join_at |
假设employee
中有一个外键列company_id
table:
with emps as (
select id, name, company_id,
row_number() over (partition by company_id order by join_date) as rn
from employee
)
select c.id, c.name as company_name,
e1.join_date as first_employee_join_at,
e2.join_date as second_employee_join_at
from company c
left join emps e1 on e1.company_id = c.id and e1.rn = 1
left join emps e2 on e2.company_id = c.id and e2.rn = 2;
虽然这不会非常有效。稍微更有效的版本将使用条件聚合:
with emps as (
select id, name, company_id,
row_number() over (partition by company_id order by join_date) as rn
from employee
)
select c.id, c.name as company_name,
max(e.join_date) filter (where rn = 1) as first_employee_join_at,
max(e.join_date) filter (where rn = 2) as second_employee_join_at
from company c
join emps e on e.company_id = c.id and e.rn in (1,2)
group by c.id, c.name;