如何在Department表中对重复DeptID的Name列填充NULL值?
处理重复部门ID的Name列填充问题
需求:当Department表中存在重复的部门ID(Dept)时,将该部门对应的Name列值填充为NULL。
原始表数据
Dept Name 200 ABC 200 XYZ 100 DEF
期望输出
Dept Name 200 NULL 100 DEF
解决方案
方法1:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
SELECT DISTINCT Dept, CASE WHEN COUNT(*) OVER (PARTITION BY Dept) > 1 THEN NULL ELSE Name END AS Name FROM Department;
逻辑说明:通过PARTITION BY Dept按部门分组统计记录数,若某部门记录数大于1(存在重复),则将Name设为NULL;DISTINCT确保每个部门只返回一行结果。
方法2:使用子查询(兼容低版本MySQL等不支持窗口函数的数据库)
SELECT d.Dept, CASE WHEN t.cnt > 1 THEN NULL ELSE d.Name END AS Name FROM Department d INNER JOIN ( SELECT Dept, COUNT(*) AS cnt FROM Department GROUP BY Dept ) t ON d.Dept = t.Dept GROUP BY d.Dept, t.cnt, d.Name HAVING t.cnt = 1 OR (t.cnt > 1 AND d.Name IS NOT NULL) ORDER BY d.Dept;
逻辑说明:先通过子查询统计每个部门的记录数,再关联原表判断;分组和HAVING子句确保重复部门只返回一行Name为NULL的结果,非重复部门保留原Name。
内容的提问来源于stack exchange,提问作者user12175004
相关产品推荐
相关产品推荐

