Postgres - 仅为一对多关系获取一行
Postgres - Fetching one row only for a One to Many relationship
我在 Postgres 中有两个 Table。它们之间是一对多的关系。
经理Table
Id Designation
1 Manager
团队成员Table
Id Designation Report_To (ManagerId)
4 INFRA ENG 1
2 SOFT ENG 1
3 TEAM LEAD 1
我必须以这样一种方式获取记录,即我只获得一个经理的一行,并将 TeamMember 指定为单独的列,如下所示:
结果:
ManagerId INFRA SOFT TEAM
1 4 2 3
我尝试使用 LEFT JOIN,但它给了我 3 行。
他将不胜感激任何帮助。
您可以进行条件聚合:
select report_to as manager_id,
max(id) filter(where designation = 'INFRA ENG') as infra,
max(id) filter(where designation = 'SOFT ENG') as soft,
max(id) filter(where designation = 'TEAM LEAD') as team
from teammember
group by report to
请注意,您无需携带 manager
table 即可获得您显示的结果。但是如果你出于其他原因想要它,你可以 join
:
select m.*,
max(tm.id) filter(where tm.designation = 'INFRA ENG') as infra,
max(tm.id) filter(where tm.designation = 'SOFT ENG') as soft,
max(tm.id) filter(where tm.designation = 'TEAM LEAD') as team
from manager m
inner join teammember tm on tm.report_to ) m.id
group by m.id
我在 Postgres 中有两个 Table。它们之间是一对多的关系。
经理Table
Id Designation
1 Manager
团队成员Table
Id Designation Report_To (ManagerId)
4 INFRA ENG 1
2 SOFT ENG 1
3 TEAM LEAD 1
我必须以这样一种方式获取记录,即我只获得一个经理的一行,并将 TeamMember 指定为单独的列,如下所示:
结果:
ManagerId INFRA SOFT TEAM
1 4 2 3
我尝试使用 LEFT JOIN,但它给了我 3 行。
他将不胜感激任何帮助。
您可以进行条件聚合:
select report_to as manager_id,
max(id) filter(where designation = 'INFRA ENG') as infra,
max(id) filter(where designation = 'SOFT ENG') as soft,
max(id) filter(where designation = 'TEAM LEAD') as team
from teammember
group by report to
请注意,您无需携带 manager
table 即可获得您显示的结果。但是如果你出于其他原因想要它,你可以 join
:
select m.*,
max(tm.id) filter(where tm.designation = 'INFRA ENG') as infra,
max(tm.id) filter(where tm.designation = 'SOFT ENG') as soft,
max(tm.id) filter(where tm.designation = 'TEAM LEAD') as team
from manager m
inner join teammember tm on tm.report_to ) m.id
group by m.id