如何在同一结果集中过滤同ID下Column2值存在于Column3的记录?
解决方案:按ID过滤Column2不在同ID Column3中的记录
原查询结果集
| ID | Column 2 | Column 3 |
|---|---|---|
| 12300 | $80 | $70 |
| 12300 | $70 | $80 |
| 12300 | $70 | $80 |
| 12313 | $10 | $100 |
| 12313 | $50 | $70 |
| 12510 | $50 | $70 |
| 12510 | $70 | $50 |
| 12510 | $10 | $120 |
过滤需求
剔除同一ID下,Column 2的值在该ID对应的Column 3中存在的记录,具体规则:
- ID 12300:$80、$70都能在同ID的Column3中找到,全部移除
- ID 12313:两条记录的Column2值都不在同ID的Column3中,全部保留
- ID 12510:仅$10不在同ID的Column3中,仅保留该条
期望结果集
| ID | Column 2 | Column 3 |
|---|---|---|
| 12313 | $10 | $100 |
| 12313 | $50 | $70 |
| 12510 | $10 | $120 |
具体实现方案
方法1:使用NOT EXISTS子查询(推荐)
把你的复杂原查询封装成CTE临时表,再通过NOT EXISTS筛选符合要求的记录:
WITH original_data AS ( -- 替换成你的原多表关联查询语句 SELECT ID, Column2, Column3 FROM your_complex_join_query ) SELECT od.ID, od.Column2, od.Column3 FROM original_data od WHERE NOT EXISTS ( SELECT 1 FROM original_data od_inner WHERE od_inner.ID = od.ID AND od_inner.Column3 = od.Column2 );
方法2:使用LEFT JOIN + 空值判断
这是等价的写法,通过左连接后筛选匹配不到的记录:
WITH original_data AS ( -- 替换成你的原多表关联查询语句 SELECT ID, Column2, Column3 FROM your_complex_join_query ) SELECT od.ID, od.Column2, od.Column3 FROM original_data od LEFT JOIN original_data od_inner ON od.ID = od_inner.ID AND od.Column2 = od_inner.Column3 WHERE od_inner.ID IS NULL;
兼容老版本数据库的写法
如果你的数据库不支持CTE(比如老版本MySQL),可以用子查询替代:
SELECT od.ID, od.Column2, od.Column3 FROM ( -- 替换成你的原多表关联查询语句 SELECT ID, Column2, Column3 FROM your_complex_join_query ) od WHERE NOT EXISTS ( SELECT 1 FROM ( -- 替换成你的原多表关联查询语句 SELECT ID, Column2, Column3 FROM your_complex_join_query ) od_inner WHERE od_inner.ID = od.ID AND od_inner.Column3 = od.Column2 );
内容的提问来源于stack exchange,提问作者NewbeeLoveCoding
相关产品推荐
相关产品推荐

