为何带别名的SQL查询可正常执行,无别名的却无返回结果?
移除SQL表别名后查询无结果的原因与解决方法
现象
- 使用表别名的查询语句可正常返回结果:
SELECT * FROM order_status_updates AS s1 JOIN orders AS s2 WHERE s2.id = (SELECT MAX(s2.id) FROM orders) AND s1.order_id = s2.id AND s1.order_status_id = s2.order_status_id
- 移除别名、直接使用原表名后,查询无返回结果:
SELECT * FROM order_status_updates JOIN orders WHERE orders.id = (SELECT MAX(orders.id) FROM orders) AND order_status_updates.order_id = orders.id AND order_status_updates.order_status_id = orders.order_status_id
原因
问题出在子查询的MAX(orders.id)上:当主查询已经引用orders表时,数据库会把子查询里的orders.id解析为主查询JOIN临时结果中的orders字段,而非整个orders数据表的所有记录。这导致子查询只能从主查询的有限结果里找最大值,而非全表的最大ID,最终条件不匹配,返回空结果。
而使用别名时,子查询里的s2.id是独立引用整个orders表的,和主查询的别名s2不存在范围冲突,能正确拿到全表最大ID,因此查询正常返回。
解决方法
给子查询里的orders表单独加别名,避免和主查询的表名冲突:
SELECT * FROM order_status_updates JOIN orders WHERE orders.id = (SELECT MAX(o.id) FROM orders AS o) AND order_status_updates.order_id = orders.id AND order_status_updates.order_status_id = orders.order_status_id
内容的提问来源于stack exchange,提问作者Darryl Hardin
相关产品推荐
相关产品推荐

