LEFT JOIN中IS NOT NULL仍显示NULL的SQL Server问题咨询
问题分析与解决
为什么Orders.OrderID IS NOT NULL放在ON子句里无效?
LEFT JOIN的核心逻辑是保留左表(Customers)的所有行,仅根据ON子句的条件匹配右表(Orders)的行:
- 当客户有符合ON条件的订单时,会关联对应的订单数据;
- 当客户没有符合条件的订单时,右表的所有列会填充为NULL,且该行依然会被保留。
你在ON子句中加入Orders.OrderID IS NOT NULL,本质是在匹配右表行时判断订单ID是否非空,但对于没有对应订单的客户,右表本身就没有匹配的行,这个条件根本不会触发,最终还是会保留该客户行并将Orders列置为NULL。这个条件在ON子句里完全起不到过滤结果的作用。
正确的查询写法
你的需求是获取下单ID为10643(你原语句中写的是10835,疑似笔误)的客户信息,推荐两种写法:
写法1:使用INNER JOIN(更贴合需求,因为只需要有对应订单的客户)
SELECT * FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderID = 10643;
写法2:使用LEFT JOIN + WHERE过滤(如果需要兼容特殊场景)
SELECT * FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderID = 10643;
注意:原语句中OrderID = 10835没有指定表名,若Customers表也存在OrderID列会引发歧义,务必加上表前缀Orders.OrderID。
内容的提问来源于stack exchange,提问作者Hibiki Supersanta
相关产品推荐
相关产品推荐

