You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询生成含员工信息与Vacant标识的职位结果表

需求说明

生成结果表,要求职位已填充员工时显示员工姓名,空缺时显示Vacant。

现有表结构及数据

Position Table

IdTitleGroupLevelpayScaleTotalpost
1General managerAl-15100001
2ManagerBl-1490005
3Asst. ManagerCl-13800010

Employee Table

IdNamePosition_id
1John Smith1
2Jane Doe2
3Michael Brown2
4Emily Johnson2
5William Lee3
6Jessica Clark3
7Christopher Harris3
8Olivia Wilson3
9Daniel Martinez3
10Sophia Miller3

期望输出

TitleGroupLevelpayScaleEmployee_Name
General managerAl-1510000John Smith
ManagerBl-149000Jane Doe
ManagerBl-149000Michael Brown
ManagerBl-149000Emily Johnson
ManagerBl-149000Vacant
ManagerBl-149000Vacant
Asst. ManagerCl-138000William Lee
Asst. ManagerCl-138000Jessica Clark
Asst. ManagerCl-138000Christopher Harris
Asst. ManagerCl-138000Olivia Wilson
Asst. ManagerCl-138000Daniel Martinez
Asst. ManagerCl-138000Sophia Miller
Asst. ManagerCl-138000Vacant
Asst. ManagerCl-138000Vacant
Asst. ManagerCl-138000Vacant
Asst. ManagerCl-138000Vacant

SQL 查询语句

WITH RECURSIVE num_seq AS (
    SELECT 1 AS seq
    UNION ALL
    SELECT seq + 1 FROM num_seq
    WHERE seq < (SELECT MAX(Totalpost) FROM Position)
)
SELECT
    p.Title,
    p.Group,
    p.Level,
    p.payScale,
    COALESCE(e.Name, '**Vacant**') AS Employee_Name
FROM Position p
JOIN num_seq ns ON ns.seq <= p.Totalpost
LEFT JOIN (
    SELECT 
        Position_id,
        Name,
        ROW_NUMBER() OVER (PARTITION BY Position_id ORDER BY Id) AS emp_seq
    FROM Employee
) e ON p.Id = e.Position_id AND ns.seq = e.emp_seq
ORDER BY p.Id, ns.seq;

实现思路

  1. 生成名额序列:用递归CTE创建连续数字序列,覆盖所有职位的最大总名额数,用来模拟每个职位的空缺位置。
  2. 扩展职位行:将职位表与数字序列关联,为每个职位生成对应Totalpost数量的行,每个行代表一个名额。
  3. 员工序号匹配:对员工表按职位分组并编号,让每个员工对应所属职位的一个名额序号。
  4. 填充空缺值:通过左连接匹配职位名额和员工,未匹配到的名额用COALESCE将空值替换为**Vacant**。
  5. 排序输出:按职位ID和名额序号排序,保证结果顺序与预期一致。

内容的提问来源于stack exchange,提问作者Ashish Kamble Akash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:12:02