如何用SQL查询同时在两家指定门店有库存的DVD
解决方法:查询同时在两家门店有库存的DVD
嘿,我来帮你搞定这个问题!你的SQL语句之所以返回的是任意一家门店有货的DVD,是因为你的EXISTS条件逻辑不对——你现在检查的是这两个门店是否存在(而不是该DVD在这两个门店都有库存),而Store表本身就有这两个门店,所以这两个条件永远为真,相当于没有做过滤。
下面给你两种靠谱的解法,你可以根据自己的习惯选择:
方法一:使用GROUP BY + HAVING(直观易读)
这种方法先筛选出目标门店的库存记录,然后按DVD分组,确保该DVD在两个门店都有库存:
SELECT d.DVD_CODE, d.DVD_NAME FROM DVD d JOIN Catalogue c ON d.DVD_CODE = c.DVD_CODE JOIN Store s ON c.STORE_CODE = s.STORE_CODE WHERE s.LOCATION IN ('Bogota', 'Buenos Aires') GROUP BY d.DVD_CODE, d.DVD_NAME HAVING COUNT(DISTINCT s.STORE_CODE) = 2;
逻辑解释:
WHERE子句先过滤出仅来自Bogota和Buenos Aires的库存记录- 按DVD的编码和名称分组后,
COUNT(DISTINCT s.STORE_CODE)统计该DVD覆盖的不同门店数量 - 当数量等于2时,说明这个DVD在两家门店都有库存记录
方法二:使用双重EXISTS(逻辑直接)
这种方法通过两个独立的子查询,分别验证该DVD在两家门店都有库存:
SELECT DISTINCT d.DVD_CODE, d.DVD_NAME FROM DVD d WHERE EXISTS ( SELECT 1 FROM Catalogue c JOIN Store s ON c.STORE_CODE = s.STORE_CODE WHERE c.DVD_CODE = d.DVD_CODE AND s.LOCATION = 'Bogota' AND c.QUANTITY > 0 -- 加上这个确保库存数量大于0,更严谨 ) AND EXISTS ( SELECT 1 FROM Catalogue c JOIN Store s ON c.STORE_CODE = s.STORE_CODE WHERE c.DVD_CODE = d.DVD_CODE AND s.LOCATION = 'Buenos Aires' AND c.QUANTITY > 0 );
逻辑解释:
- 第一个
EXISTS检查当前DVD在Bogota门店有库存 - 第二个
EXISTS检查当前DVD在Buenos Aires门店有库存 - 只有两个条件都满足时,该DVD才会被返回
用你的测试数据跑这两个查询,都会返回The Matrix(DVD_CODE=123),这正是你要的结果!
内容的提问来源于stack exchange,提问作者Pablo88
相关产品推荐
相关产品推荐

