基于分组记录更新字段值:No_Name的Keys列更新规则求助
解决方案:按建筑批量更新Janitor的Keys字段
场景示例
| Building Name | Janitor | Keys | Notes |
|---|---|---|---|
| Building A | Andrew | Yes | |
| Building A | Mike | Yes | |
| Building A | Bill | NULL | |
| Building A | Phil | Yes | |
| Building A | No_Name | NULL | --- 应保持NULL |
| Building B | Andrew | NULL | |
| Building B | Mike | NULL | |
| Building B | Bill | NULL | |
| Building B | Phil | NULL | |
| Building B | No_Name | NULL | --- 应改为'NONE',因无管理员持有钥匙 |
可行的SQL更新语句
以下两种方法都能实现需求,可根据你的数据库类型选择:
方法1:子查询关联判断(兼容大部分数据库)
UPDATE your_table t1 SET Keys = 'None' WHERE t1.Janitor = 'No_Name' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.`Building Name` = t1.`Building Name` AND t2.Janitor != 'No_Name' AND t2.Keys IS NOT NULL );
逻辑说明:通过NOT EXISTS检查当前建筑下是否存在非No_Name的管理员且Keys不为NULL。如果不存在这类记录,就将该建筑的No_Name记录的Keys更新为None;反之则不修改。
方法2:窗口函数预计算(适用于MySQL 8+、PostgreSQL、SQL Server等支持CTE和窗口函数的数据库)
WITH building_key_status AS ( SELECT `Building Name`, -- 标记该建筑是否有管理员持有有效钥匙 MAX(CASE WHEN Janitor != 'No_Name' AND Keys IS NOT NULL THEN 1 ELSE 0 END) AS has_valid_keys FROM your_table GROUP BY `Building Name` ) UPDATE your_table t JOIN building_key_status b ON t.`Building Name` = b.`Building Name` SET t.Keys = 'None' WHERE t.Janitor = 'No_Name' AND b.has_valid_keys = 0;
逻辑说明:先通过CTE预计算每个建筑的钥匙状态(has_valid_keys为0表示所有非No_Name管理员的Keys都是NULL),再关联原表更新符合条件的No_Name记录。
内容的提问来源于stack exchange,提问作者Andrew L
相关产品推荐
相关产品推荐

