面试技术问题:如何从Employee表生成男女分栏查询结果
解决方案:将Employee表的男性姓名和女性姓名分两列输出
没问题,这个需求可以通过窗口函数或者自定义行号的方式实现,先假设你的Employee表包含name(姓名)和gender(性别,比如值为'M'/'F'或'男'/'女')字段,下面是两种常用的实现方式:
方法一:使用ROW_NUMBER()窗口函数(适用于支持窗口函数的数据库,如PostgreSQL、MySQL 8.0+、SQL Server等)
这种方法通过给男性和女性分别生成行号,再通过行号关联来实现两列对齐:
WITH male_employees AS ( SELECT name, ROW_NUMBER() OVER (ORDER BY name) AS rn -- 顺序不限,这里按姓名排序,也可以换成employee_id或其他字段 FROM Employee WHERE gender = 'M' -- 若性别是中文则改为'男' ), female_employees AS ( SELECT name, ROW_NUMBER() OVER (ORDER BY name) AS rn FROM Employee WHERE gender = 'F' -- 若性别是中文则改为'女' ) SELECT me.name AS MaleNames, fe.name AS FemaleNames FROM male_employees me FULL OUTER JOIN female_employees fe ON me.rn = fe.rn;
说明:
- 用CTE分别筛选出男性和女性,并为每类生成唯一行号
- 使用
FULL OUTER JOIN确保所有姓名都被展示,若某一性别数量更多,多出的行对应的另一列会显示NULL - 题目要求姓名顺序不限,你可以修改
ORDER BY后的字段来调整排序逻辑,甚至去掉ORDER BY(取决于数据库是否允许无排序的窗口函数)
方法二:使用自定义变量生成行号(适用于不支持窗口函数的老版本数据库,如MySQL 5.x)
如果你的数据库不支持窗口函数,可以用变量来手动生成行号:
SET @male_rn = 0; SET @female_rn = 0; SELECT me.name AS MaleNames, fe.name AS FemaleNames FROM (SELECT name, @male_rn := @male_rn + 1 AS rn FROM Employee WHERE gender = 'M') me FULL OUTER JOIN (SELECT name, @female_rn := @female_rn + 1 AS rn FROM Employee WHERE gender = 'F') fe ON me.rn = fe.rn;
说明:
- 通过初始化变量
@male_rn和@female_rn,在子查询中为每类性别递增生成行号 - 同样使用
FULL OUTER JOIN关联两行号,保证所有姓名都被输出
内容的提问来源于stack exchange,提问作者Pravin Yadav
相关产品推荐
相关产品推荐

