如何在列中精确匹配仅含指定多个UPC值的拣货单?
仅包含指定UPC的拣货单查询方案
你需要的是只包含指定UPC(038447302、00934831)的拣货单,原查询的问题在于:它只是筛选出包含这两个UPC的条目,但没有排除那些拣货单中同时存在其他UPC的情况。
解决方案一:使用HAVING子句过滤拣货单的UPC范围
通过分组到拣货单级别,确保该拣货单下所有UPC都属于指定集合,且不同UPC的数量正好等于你指定的数量(这里是2):
SELECT a.order_id, a.id AS picklist_id, SUM(p.quantity), pick_zone, a.STATUS FROM picklists a INNER JOIN picklist_items p ON p.picklist_id = a.id INNER JOIN warehouse_orders f ON a.order_id = f.id WHERE a.STATUS IN ('dropped') AND f.status != 'cancelled' AND p.upc IN ('038447302', '00934831') GROUP BY a.STATUS, a.picklist_group_id, a.id, a.order_id, pick_zone HAVING COUNT(DISTINCT p.upc) = 2
逻辑说明:
- WHERE子句先过滤出状态符合要求、且包含指定UPC的条目;
- GROUP BY按拣货单分组后,HAVING
COUNT(DISTINCT p.upc) = 2确保该拣货单下只有这两个指定的UPC(没有其他额外UPC)。如果后续指定的UPC数量变化,只需修改这个数字即可。
解决方案二:用子查询排除含其他UPC的拣货单
先找出所有包含非指定UPC的拣货单ID,再在主查询中排除这些ID:
SELECT a.order_id, a.id AS picklist_id, SUM(p.quantity), p.upc, pick_zone, a.STATUS FROM picklists a INNER JOIN picklist_items p ON p.picklist_id = a.id INNER JOIN warehouse_orders f ON a.order_id = f.id WHERE a.STATUS IN ('dropped') AND f.status != 'cancelled' AND a.id NOT IN ( SELECT DISTINCT picklist_id FROM picklist_items WHERE upc NOT IN ('038447302', '00934831') ) GROUP BY a.STATUS, a.picklist_group_id, a.id, a.order_id, pick_zone, p.upc
逻辑说明:
子查询先找出所有包含非指定UPC的拣货单ID,主查询通过NOT IN排除这些拣货单,剩下的就是仅包含指定UPC的拣货单。
内容的提问来源于stack exchange,提问作者Michael Warren
相关产品推荐
相关产品推荐

