如何删除未包含全部指定INTRAWORKNO的SEQUENCE数据
解决SEQUENCE完整性校验与删除问题
问题核心
直接使用GROUP BY SEQUENCE + COUNT(INTRAWORKNO)无法得到预期结果,原因是同一SEQUENCE下的同一INTRAWORKNO可能对应多个part,导致计数包含重复项,无法准确判断是否覆盖了@workREQUIREMENTS中的所有必填INTRAWORKNO。
可行解决方案
我们需要先识别出不满足条件的SEQUENCE,再批量删除其对应数据,以下提供两种可靠实现方式:
方法一:基于唯一值计数对比
先统计@workREQUIREMENTS中必填INTRAWORKNO的总数量,再对比每个SEQUENCE下唯一INTRAWORKNO的数量,筛选出数量不足的SEQUENCE并删除:
-- 定义CTE获取必填项总数和每个SEQUENCE的唯一INTRAWORKNO数量 WITH required_total AS ( SELECT COUNT(*) AS total FROM @workREQUIREMENTS ), sequence_unique_intras AS ( SELECT SEQUENCE, COUNT(DISTINCT INTRAWORKNO) AS unique_intra_count FROM @results GROUP BY SEQUENCE ) -- 删除不满足条件的SEQUENCE数据 DELETE FROM @results WHERE SEQUENCE IN ( SELECT su.SEQUENCE FROM sequence_unique_intras su CROSS JOIN required_total rt WHERE su.unique_intra_count < rt.total )
方法二:基于缺失项检查(更精准)
通过交叉连接生成所有SEQUENCE与必填INTRAWORKNO的组合,再左连接@results找出缺失的组合,最终删除存在缺失项的SEQUENCE:
-- 找出所有存在缺失必填项的SEQUENCE WITH missing_required_intras AS ( SELECT s.SEQUENCE FROM @workREQUIREMENTS wr CROSS JOIN (SELECT DISTINCT SEQUENCE FROM @results) s LEFT JOIN @results r ON s.SEQUENCE = r.SEQUENCE AND wr.INTRAWORKNO = r.INTRAWORKNO WHERE r.INTRAWORKNO IS NULL ) -- 删除对应SEQUENCE的所有数据 DELETE FROM @results WHERE SEQUENCE IN (SELECT DISTINCT SEQUENCE FROM missing_required_intras)
说明
- 两种方法均能处理以下场景:
- 缺少部分必填
INTRAWORKNO的SEQUENCE(如示例中的1、3) - 无任何匹配必填项的
SEQUENCE(如示例中的6、7) - 包含所有必填项但存在多子部件的
SEQUENCE(如示例中的8)会被保留
- 缺少部分必填
- 方法二的优势在于可以直观看到每个
SEQUENCE具体缺失哪些INTRAWORKNO,便于排查问题。
内容的提问来源于stack exchange,提问作者Lukas Fürst
相关产品推荐
相关产品推荐

