You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:36:00