如何编写SQL查询返回完全不含指定Property_ID的店铺编号
解决方法
原查询的问题在于,它只是排除了Property_ID=113的行,但那些同时拥有其他属性和113的店铺(比如222222),其非113属性的行依然会被选中,导致结果包含这类店铺。以下是几种正确的实现方式:
方法一:使用NOT EXISTS
通过检查店铺不存在Property_ID=113的记录来筛选:
SELECT DISTINCT s.Shop_number FROM Shops s WHERE NOT EXISTS ( SELECT 1 FROM Properties p WHERE p.Shop_number = s.Shop_number AND p.Property_ID = 113 );
如果只从Properties表查询,也可以这样写:
SELECT DISTINCT p.Shop_number FROM Properties p WHERE NOT EXISTS ( SELECT 1 FROM Properties p2 WHERE p2.Shop_number = p.Shop_number AND p2.Property_ID = 113 );
方法二:使用GROUP BY + HAVING
通过分组后筛选不包含113的店铺:
SELECT Shop_number FROM Properties GROUP BY Shop_number HAVING SUM(CASE WHEN Property_ID = 113 THEN 1 ELSE 0 END) = 0;
也可以用MAX简化判断逻辑:
SELECT Shop_number FROM Properties GROUP BY Shop_number HAVING MAX(CASE WHEN Property_ID = 113 THEN 1 ELSE 0 END) = 0;
核心逻辑是:分组后检查该店铺对应的属性组里是否存在113,若不存在则返回该店铺编号。
方法三:使用LEFT JOIN排除
通过左连接后筛选没有匹配到113的记录:
SELECT DISTINCT p.Shop_number FROM Properties p LEFT JOIN Properties p2 ON p.Shop_number = p2.Shop_number AND p2.Property_ID = 113 WHERE p2.Shop_number IS NULL;
左连接后,没有113属性的店铺对应的p2字段会是NULL,通过这个条件即可筛选出目标结果。
以上三种方法都能得到期望的结果:仅返回222225和222226。
内容的提问来源于stack exchange,提问作者RaPtiLE
相关产品推荐
相关产品推荐

