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

面试技术问题:如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:33:07