一对多关系的单SQL选择查询
没有例子,这个问题很难解释 我有两张表,公司和员工,他们有一对多的关系,一个公司可以接待多个员工 这里显示了最简单的表结构一对多关系的单SQL选择查询,sql,postgresql,one-to-many,Sql,Postgresql,One To Many,没有例子,这个问题很难解释 我有两张表,公司和员工,他们有一对多的关系,一个公司可以接待多个员工 这里显示了最简单的表结构 Company | id | name | Employee | id | name | company_id | join_date | 现在的问题是: 如何选择前两名员工并在公司表中以列形式显示他们的加入日期 结果是这样的 | id | company_name | first_employee_join_at | second_employee_join_a
Company
| id | name |
Employee
| id | name | company_id | join_date |
现在的问题是:
如何选择前两名员工并在公司表中以列形式显示他们的加入日期
结果是这样的
| id | company_name | first_employee_join_at | second_employee_join_at |
假设在
employee
表中有一个外键列company\u id
:
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;
假设在
employee
表中有一个外键列company\u id
:
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;
你说的前两名员工是什么意思?“前两名员工”我猜是先加入公司的,对吧?你能提供列定义吗?公司和员工是如何联系的?某处有公司id吗?你说的前两名员工是什么意思?“前两名员工”我想是先加入公司的人吧?你能提供列定义吗?公司和员工是如何联系的?某处是否有
公司id
?