如何用Oracle SQL查询使用指定组合供应商的门店主键ID
原SQL问题分析
你编写的SQL逻辑不成立:WHERE条件要求同一行的SupplierID同时满足等于001且等于002/003,但表中每行仅对应一个供应商ID,没有符合条件的行,因此没有返回结果。
正确Oracle SQL写法
以下三种写法都可以实现需求,返回你预期的123456、345678两个门店ID:
写法1:聚合分组(推荐,性能稳定,适合大数据量)
SELECT StoreID FROM SUPPLIERS WHERE SupplierID IN ('001', '002', '003') GROUP BY StoreID HAVING -- 校验门店是否使用了001 SUM(CASE WHEN SupplierID = '001' THEN 1 ELSE 0 END) >= 1 -- 校验门店是否额外使用了002或003 AND SUM(CASE WHEN SupplierID IN ('002', '003') THEN 1 ELSE 0 END) >= 1;
注:SupplierID为字符串类型,加单引号避免隐式转换丢失前缀0
写法2:集合交集(最简洁,可读性高)
-- 取「用了001的门店」和「用了002/003的门店」的交集 SELECT StoreID FROM SUPPLIERS WHERE SupplierID = '001' INTERSECT SELECT StoreID FROM SUPPLIERS WHERE SupplierID IN ('002', '003');
写法3:表自连接
SELECT DISTINCT s1.StoreID FROM SUPPLIERS s1 INNER JOIN SUPPLIERS s2 ON s1.StoreID = s2.StoreID WHERE s1.SupplierID = '001' AND s2.SupplierID IN ('002', '003');
内容的提问来源于stack exchange,提问作者Wayne Eastwood
相关产品推荐
相关产品推荐

