如何按CheckoutId分组实现NOT IN批量筛选SQL查询?
解决方案:按CheckoutId批次排除包含目标ProductId的行
要实现你的需求,核心是先找出所有包含ProductId=2345的CheckoutId,然后排除这些批次下的所有行,只保留完全不包含目标ProductId的CheckoutId对应的记录。以下是两种可行的SQL写法:
方法1:使用NOT IN子查询
SELECT * FROM CHECKOUTS WHERE CheckoutId NOT IN ( -- 先找出所有包含ProductId=2345的CheckoutId SELECT DISTINCT CheckoutId FROM CHECKOUTS WHERE ProductId = 2345 );
方法2:使用LEFT JOIN过滤
如果你的表数据量较大,这种写法通常性能更优:
SELECT c.* FROM CHECKOUTS c LEFT JOIN ( SELECT DISTINCT CheckoutId FROM CHECKOUTS WHERE ProductId = 2345 ) excluded_checkouts ON c.CheckoutId = excluded_checkouts.CheckoutId WHERE excluded_checkouts.CheckoutId IS NULL;
逻辑说明
- 子查询
excluded_checkouts会筛选出所有包含Toy1(ProductId=2345)的CheckoutId - 外层查询只保留不在这个排除列表里的CheckoutId对应的行,这样Toy2所在的批次因为包含目标ProductId被整体排除,最终只返回Toy3的记录
针对你的问题:
- 完全可行,不需要新增查询参数,只需要调整查询逻辑,从过滤单个ProductId改为过滤整个包含目标ProductId的CheckoutId批次即可。
内容的提问来源于stack exchange,提问作者pqcqe
相关产品推荐
相关产品推荐

