MySQL实现:若存在Cancellation则移除对应Nr的所有相关行
用WHERE子句过滤已核销发票,生成未结头寸列表
需求说明
需要生成清晰的未结头寸列表供销售/财务查看,规则是:当某张Invoice存在对应的Cancellation记录时,同时移除该Invoice和Cancellation行,最终仅保留无对应核销记录的Invoice。
原始数据
| ID | Nr | Type | Amount |
|---|---|---|---|
| 1 | NR-100 | Invoice | 100 |
| 2 | NR-101 | Invoice | 200 |
| 3 | NR-102 | Invoice | 300 |
| 4 | NR-100 | Cancellation | 100 |
| 5 | NR-102 | Cancellation | 300 |
| 6 | NR-103 | Invoice | 150 |
预期结果
| ID | Nr | Type | Amount |
|---|---|---|---|
| 2 | NR-101 | Invoice | 200 |
| 6 | NR-103 | Invoice | 150 |
解决方案(WHERE子句实现)
以下两种方案均通过WHERE子句完成过滤,精准匹配需求:
方案1:NOT EXISTS子查询
直接在WHERE中判断当前Invoice的编号不存在对应的Cancellation记录:
SELECT * FROM your_table WHERE Type = 'Invoice' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Nr = your_table.Nr AND t2.Type = 'Cancellation' );
方案2:LEFT JOIN + 空值判断
通过左关联匹配Cancellation记录,再过滤掉有匹配的Invoice:
SELECT t1.* FROM your_table t1 LEFT JOIN your_table t2 ON t1.Nr = t2.Nr AND t2.Type = 'Cancellation' WHERE t1.Type = 'Invoice' AND t2.ID IS NULL;
说明
- 两种方案都会自动排除所有Cancellation行,同时移除有对应核销记录的Invoice,完全符合未结头寸的要求。
- 若此前使用GROUP BY未得到预期结果,大概率是未明确限定
Type = 'Invoice',或未正确判断该编号是否存在有效的Cancellation记录。
内容的提问来源于stack exchange,提问作者Renanigans
相关产品推荐
相关产品推荐

