如何按相同department_id组合条件删除数据库表中指定数据?
数据清理SQL解决方案
原始数据表
| department_id | protect | nature |
|---|---|---|
| 10 | 环境保护 | 警方 |
| 10 | 红喉蜂鸟 | 保护 |
| 10 | 美洲豹 | 保护 |
| 10 | 鬃狼 | 保护 |
| 10 | 动物 | 非政府组织 |
| 10 | 售卖 | 动物 |
| 0 | 动物 | 虐待 |
| 0 | 售卖 | 动物 |
| 1 | 售卖 | 动物 |
| 1 | 动物 | 虐待 |
需求说明
- 删除同一
department_id下同时存在以下两类记录的对应行:protect='售卖'且nature='动物'、protect='动物'且nature='虐待' - 若同一
department_id下存在protect='动物'且nature='非政府组织'的记录,则保留该部门的protect='售卖'且nature='动物'和protect='动物'且nature='非政府组织'记录
错误SQL尝试
DELETE FROM table WHERE (protect = 'sale of' and protect = 'animal' and nature = 'animals') and department_id = department_id
期望结果表
| department_id | protect | nature |
|---|---|---|
| 10 | 环境保护 | 警方 |
| 10 | 红喉蜂鸟 | 保护 |
| 10 | 美洲豹 | 保护 |
| 10 | 鬃狼 | 保护 |
| 10 | 动物 | 非政府组织 |
| 10 | 售卖 | 动物 |
正确的SQL删除语句
DELETE FROM your_table_name WHERE department_id IN ( SELECT department_id FROM your_table_name GROUP BY department_id HAVING COUNT(CASE WHEN protect = '动物' AND nature = '非政府组织' THEN 1 END) = 0 AND COUNT(CASE WHEN protect = '售卖' AND nature = '动物' THEN 1 END) > 0 AND COUNT(CASE WHEN protect = '动物' AND nature = '虐待' THEN 1 END) > 0 ) AND ( (protect = '售卖' AND nature = '动物') OR (protect = '动物' AND nature = '虐待') );
关键逻辑说明
- 子查询筛选目标部门:先找出符合删除条件的
department_id——这类部门没有"动物-非政府组织"的记录,但同时存在需要删除的两类目标记录 - 精准删除目标行:外层语句仅针对这些部门,删除
protect='售卖'且nature='动物'或protect='动物'且nature='虐待'的行 - 替换语句中的
your_table_name为你的实际表名即可执行
内容的提问来源于stack exchange,提问作者Help my Brother
相关产品推荐
相关产品推荐

