在SQL Server中过滤多行:匹配条件则删除同StaffID的所有行
解决方案:根据filteredID过滤并删除对应staffID的所有行
需求回顾
原始数据表示例:
| staffID | name | filteredID |
|---|---|---|
| 1 | james | 50 |
| 1 | james | 88 |
| 1 | james | 100 |
| 2 | lily | 30 |
| 2 | lily | 60 |
| 3 | tom | 70 |
需求:当指定filteredID(比如50或88)时,删除所有与这些filteredID关联的staffID对应的所有行,最终得到的结果表:
| staffID | name | filteredID |
|---|---|---|
| 2 | lily | 30 |
| 2 | lily | 60 |
| 3 | tom | 70 |
下面给你两种常见场景的简洁实现方案:
方案1:SQL实现
核心思路是先通过子查询找出需要排除的staffID集合,再筛选出不在该集合中的行。
假设你的表名为staff_records,目标filteredID为50和88,查询结果的代码如下:
SELECT * FROM staff_records WHERE staffID NOT IN ( -- 先找出关联目标filteredID的所有唯一staffID SELECT DISTINCT staffID FROM staff_records WHERE filteredID IN (50, 88) );
如果需要直接删除表中符合条件的行(注意提前备份数据):
DELETE FROM staff_records WHERE staffID IN ( SELECT DISTINCT staffID FROM staff_records WHERE filteredID IN (50, 88) );
方案2:Python Pandas实现
如果你用Pandas处理DataFrame,步骤同样简洁高效:
假设你的数据框名为df,代码如下:
# 1. 提取需要排除的所有staffID(去重避免重复判断) exclude_staff_ids = df[df['filteredID'].isin([50, 88])]['staffID'].unique() # 2. 筛选出不属于排除列表的行,得到结果 result_df = df[~df['staffID'].isin(exclude_staff_ids)]
解释:
df['filteredID'].isin([50, 88])定位到所有filteredID匹配目标值的行,提取对应的staffID并去重得到exclude_staff_ids~符号表示取反,筛选出staffID不在排除列表中的所有行,就是你要的最终结果。
内容的提问来源于stack exchange,提问作者Frostless
相关产品推荐
相关产品推荐

