技术求助:如何正确筛选不库存2003-01-01后生产产品的商店
解决思路与修正后的SQL语句
我来帮你搞定这个问题!你的需求是找出完全没有库存2003年1月1日及之后生产的产品的商店——也就是那些店里的所有产品都在这个日期之前生产的,对吧?
原SQL语句的问题分析
你原来的语句之所以会把同时有两类产品的商店也拉出来,是因为NOT IN会匹配商店里任何一个不在子查询里的产品编码:只要商店有一个产品符合“2003年前生产”的条件,就会被纳入结果,哪怕它同时库存2003年后的产品。这显然不符合你要的“完全不库存后期产品”的要求。
方案一:排除所有存在后期产品的商店
先找出所有曾库存过2003年后产品的商店,再从总商店列表里排除它们,剩下的就是目标商店:
SELECT s.name FROM Store s WHERE s.ID NOT IN ( -- 子查询:找出所有有2003年后产品的商店ID SELECT DISTINCT si.ID FROM StockInfo si WHERE si.productRelease >= '2003-01-01' )
- 这里用
>= '2003-01-01'替代BETWEEN,避免因日期带时间导致的匹配遗漏(比如2003-01-01 10:00:00这类带时分秒的日期,BETWEEN可能会因为上限设置问题漏判)。 - 用商店ID关联比名称更可靠,哪怕名称唯一,主键ID的关联效率和准确性都更高。
方案二:分组验证商店所有产品的生产日期
通过分组后判断商店的所有产品中,最晚的生产日期仍早于2003年1月1日:
SELECT s.name FROM Store s JOIN StockInfo si ON s.ID = si.ID GROUP BY s.ID, s.name -- 确保该商店所有产品的最晚生产日期都在2003-01-01之前 HAVING MAX(si.productRelease) < '2003-01-01'
这个思路更直观:如果一个商店库存的所有产品里,生产时间最晚的都早于目标日期,那它肯定完全没有后期产品。
内容的提问来源于stack exchange,提问作者Plus Twenty
相关产品推荐
相关产品推荐

