SQL Server已弃用*=外连接运算符转LEFT JOIN等价写法咨询
解答
第一种改写是和原始SQL等价的正确写法,相关逻辑说明如下:
旧*=运算符的规则说明
早期SQL(如旧版SQL Server、Sybase)中,*=是左连接的非标准语法,左表.字段 *= 右表.字段表示左表与右表做左外连接,关联条件为两边字段相等。所有直接写在WHERE子句中、针对右表的过滤条件,都属于左连接的关联条件,而非全局过滤条件。
两种改写的差异对比
- 第一种改写:将
SalesOrders.OrderNumber = 1000放在ON子句中,作为左连接的关联条件
执行逻辑:返回所有Customers表的客户记录,仅当客户存在订单号为1000的订单时,才会匹配到对应的OrderNumber值,没有对应订单的客户OrderNumber会返回NULL,和原始代码逻辑完全一致。 - 第二种改写:将
SalesOrders.OrderNumber = 1000放在WHERE子句中,作为全局过滤条件
执行逻辑:左连接执行后,会过滤掉所有OrderNumber为NULL的记录(NULL和1000比较不成立),最终仅保留有1000号订单的客户,等价于INNER JOIN,和原始代码逻辑完全不同。你提到的「第二种改写中LEFT JOIN没有实际作用」的判断完全正确。
原始写法中*=的意义
原始写法使用*=的核心需求是保留所有客户的记录,哪怕没有1000号订单。如果将*=换成普通的=(内连接),最终结果仅会返回有1000号订单的客户,和左连接的结果差异很大,所以*=的使用有明确意义。
内容的提问来源于stack exchange,提问作者sorimaki
相关产品推荐
相关产品推荐

