为何无负数量时SQL的=ALL子查询仍返回结果?
问题解答
核心原因:SQL中的「空真」逻辑
当你使用=ALL子查询时,其逻辑是:外层的ProductID必须等于子查询返回的每一条记录。如果子查询没有返回任何结果(也就是空集),这个条件会自动判定为TRUE——因为不存在任何一条子查询记录违反“ProductID等于它”的要求,这在逻辑上叫做「空真」(全称命题在空集合上默认成立)。
对比你预期的差异
你误以为会返回空集,大概率是混淆了=ALL和IN的逻辑:
ProductID IN (空集):这个条件会判定为FALSE,因为没有任何值能匹配空集,所以返回空结果。ProductID =ALL (空集):如上述,条件为TRUE,所以返回所有符合外层其他条件的记录(也就是整个Products表的ProductName)。
验证与修正
如果希望子查询为空时返回空集,可以给外层条件加上EXISTS判断,确保子查询有结果时才执行匹配:
SELECT ProductName FROM Products WHERE EXISTS ( SELECT ProductID FROM OrderDetails WHERE Quantity < 0 ) AND ProductID =ALL ( SELECT ProductID FROM OrderDetails WHERE Quantity < 0 ) ORDER BY ProductID;
内容的提问来源于stack exchange,提问作者DiMaria
相关产品推荐
相关产品推荐

