查找SQL表中缺少指定ShipConfirm事件的同OrderId/ProductId记录
解决方案
下面提供几种高效的SQL查询方法,帮你找出缺失ShipConfirm事件的OrderId和ProductId组合:
方法1:使用NOT EXISTS子查询
这是最直观的写法,通过子查询检查同一组合下是否存在目标事件:
SELECT DISTINCT OrderId, ProductId FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.OrderId = t1.OrderId AND t2.ProductId = t1.ProductId AND t2.Event = 'ShipConfirm' );
DISTINCT确保每个OrderId+ProductId组合只返回一次- 子查询验证当前组合是否存在
ShipConfirm事件,不存在则被筛选出来
方法2:LEFT JOIN + IS NULL
通过左连接匹配目标事件,筛选未匹配到的记录:
SELECT DISTINCT t1.OrderId, t1.ProductId FROM your_table_name t1 LEFT JOIN your_table_name t2 ON t1.OrderId = t2.OrderId AND t1.ProductId = t2.ProductId AND t2.Event = 'ShipConfirm' WHERE t2.OrderId IS NULL;
- 左连接后,没有对应
ShipConfirm事件的记录中,t2的字段会是NULL,以此作为筛选条件
方法3:GROUP BY + HAVING统计
通过分组统计目标事件的数量,筛选数量为0的组合:
SELECT OrderId, ProductId FROM your_table_name GROUP BY OrderId, ProductId HAVING SUM(CASE WHEN Event = 'ShipConfirm' THEN 1 ELSE 0 END) = 0;
- 按
OrderId+ProductId分组,用CASE统计每个组内ShipConfirm的出现次数 - 次数为0的组合即为缺失目标事件的记录
注意
请将上述代码中的your_table_name替换为你实际使用的表名。如果需要查看这些缺失组合的所有事件记录,可以将查询结果与原表关联查询。
内容的提问来源于stack exchange,提问作者Deivinho
相关产品推荐
相关产品推荐

