如何用WHERE或JOIN编写SQL查询筛选拥有全部指定物料编号的企业
筛选同时拥有指定物料的企业的SQL方案
要解决这个「只保留同时拥有物料编号1、2、3的企业」的需求,这里有几种高效且易理解的SQL写法,都能精准获取你要的企业1的数据:
方法1:GROUP BY + HAVING(最常用的聚合筛选)
这个思路是先按企业分组,统计该企业拥有的目标物料的唯一数量,只有当数量等于3(也就是1、2、3全齐)时才保留。
SELECT COMPANY_ID FROM #TmpTran WHERE ITEM_NUMBER IN (1, 2, 3) -- 先缩小范围到目标物料 GROUP BY COMPANY_ID HAVING COUNT(DISTINCT ITEM_NUMBER) = 3; -- 确保三个物料都有
注:如果你的数据里不会出现同一企业同一物料重复的情况,COUNT(DISTINCT ...)可以简化成COUNT(*),性能会更好。
方法2:多表JOIN(逻辑直观的匹配方式)
通过三次自连接,分别匹配物料1、2、3,只有同时满足三个连接条件的企业才会被筛选出来:
SELECT DISTINCT t1.COMPANY_ID FROM #TmpTran t1 JOIN #TmpTran t2 ON t1.COMPANY_ID = t2.COMPANY_ID AND t2.ITEM_NUMBER = 2 JOIN #TmpTran t3 ON t1.COMPANY_ID = t3.COMPANY_ID AND t3.ITEM_NUMBER = 3 WHERE t1.ITEM_NUMBER = 1;
方法3:WHERE EXISTS子查询(逐条件校验)
用三个EXISTS子查询分别校验企业是否存在每个物料的记录,逻辑清晰,适合后续要添加更多物料条件的场景:
SELECT DISTINCT COMPANY_ID FROM #TmpTran t WHERE EXISTS (SELECT 1 FROM #TmpTran WHERE COMPANY_ID = t.COMPANY_ID AND ITEM_NUMBER = 1) AND EXISTS (SELECT 1 FROM #TmpTran WHERE COMPANY_ID = t.COMPANY_ID AND ITEM_NUMBER = 2) AND EXISTS (SELECT 1 FROM #TmpTran WHERE COMPANY_ID = t.COMPANY_ID AND ITEM_NUMBER = 3);
把以上任意一段SQL放到你的临时表环境中运行,都会只返回COMPANY_ID = 1的结果,完美符合你的需求。
内容的提问来源于stack exchange,提问作者user2837480
相关产品推荐
相关产品推荐

