SQL实现筛选关联最终产品全为Active状态的物料分组
物料关联产品状态分组筛选SQL实现
核心逻辑
按物料维度分组,仅保留所有关联最终产品状态均为Active的物料,其余两类(状态混杂、全为Inactive)全部排除。
假设业务表名为material_part,核心字段如下:
material_id:物料零件唯一标识final_product_id:关联的最终产品唯一标识product_status:最终产品状态,枚举值为Active(启用)、Inactive(停用)
实现方案
方案1:分组聚合筛选(优先推荐,性能更好)
直接按物料ID分组,通过HAVING子句过滤掉存在非Active状态关联产品的物料,适合直接提取符合条件的物料清单:
SELECT material_id -- 若需要查询物料其他属性,可通过聚合函数获取,例如 MAX(material_name) AS material_name FROM material_part GROUP BY material_id HAVING SUM( CASE -- 若状态字段可能为NULL,可在此处加 OR product_status IS NULL 把空值按非Active处理 WHEN product_status <> 'Active' THEN 1 ELSE 0 END ) = 0;
方案2:反向不存在校验(适合提取明细场景)
如果需要拿到符合条件的物料对应的所有关联产品明细行,可使用NOT EXISTS写法,避免分组聚合:
SELECT DISTINCT m.material_id, m.final_product_id, m.product_status -- 可加其他需要的明细字段 FROM material_part m WHERE NOT EXISTS ( SELECT 1 FROM material_part m2 WHERE m2.material_id = m.material_id AND m2.product_status <> 'Active' -- 同样,NULL场景可加 OR m2.product_status IS NULL );
逻辑校验
| 物料关联产品状态情况 | 非Active状态计数 | 是否被筛选保留 | 匹配规则 |
|---|---|---|---|
| 全部为Active | 0 | 是 | 规则1 |
| 同时存在Active/Inactive | 大于0 | 否 | 规则2 |
| 全部为Inactive | 等于组内总行数(大于0) | 否 | 规则2 |
内容的提问来源于stack exchange,提问作者vitezslav
相关产品推荐
相关产品推荐

