MS SQL子查询问题:筛选购买高价商品的客户时返回结果异常
子查询返回不符合条件记录的常见错误原因
子查询未限定列所属表,错误引用外层表字段
这是最高发的问题:当子查询和外层查询存在同名字段时,如果你没有给表加别名明确指定列所属的表,SQL会优先匹配外层查询的列,导致筛选条件变成恒成立的表达式。
错误示例:-- 子查询中price实际匹配的是外层orders表的price字段,相当于o.price > o.price SELECT DISTINCT customer_id FROM orders o WHERE o.price > (SELECT price FROM products p WHERE p.product_id = 1001)修正方案:所有列都加表别名限定:
SELECT DISTINCT customer_id FROM orders o WHERE o.price > (SELECT p.price FROM products p WHERE p.product_id = 1001)EXISTS相关子查询漏写外层关联条件
如果你用的是EXISTS语法实现需求,子查询必须和外层的客户/订单做关联,否则子查询只要存在任意一条符合条件的记录,外层所有记录都会被返回。
错误示例:-- 子查询没有关联外层的客户ID,只要有任意订单价格高于目标价,所有客户都会被返回 SELECT DISTINCT customer_id FROM orders o WHERE EXISTS (SELECT 1 FROM orders o2 WHERE o2.price > (SELECT p.price FROM products p WHERE p.product_id = 1001))修正方案:补充外层关联条件:
SELECT DISTINCT customer_id FROM orders o WHERE EXISTS (SELECT 1 FROM orders o2 WHERE o2.customer_id = o.customer_id AND o2.price > (SELECT p.price FROM products p WHERE p.product_id = 1001))目标商品筛选条件错误,子查询返回价格远低于预期
如果你指定目标商品的筛选条件写错,比如把product_id = 1001写成了category_id = 1,子查询实际返回的是分类下最低的商品价格,就会出现大部分订单价格都高于该值的情况。比较符逻辑错误,或误用ANY/ALL关键字
如果你的子查询返回多个价格值,使用普通比较符>会触发报错,如果你误用了> ANY,只要订单价格高于任意一个子查询返回的价格就会被匹配,也可能出现返回结果远超预期的情况。
内容的提问来源于stack exchange,提问作者Richard Johnson
相关产品推荐
相关产品推荐

