Access嵌套JOIN语法原理及转SQL Server等价写法咨询
Access嵌套JOIN语法运行规则说明
你看到的括号嵌套JOIN结构不是子查询,是SQL标准中用于明确多表连接执行优先级的合法语法,Access原生支持该写法,SQL Server等主流数据库也兼容该规则,不需要在括号内加SELECT语句。
原Access FROM子句执行顺序
你提到的这段FROM逻辑按括号从内到外依次执行:
FROM tblSPSTeams RIGHT JOIN(tblFSOTeams INNER JOIN(tblInventoryUnit INNER JOIN tblVehicle ON tblInventoryUnit.[ORG-IU] = tblVehicle.[ORG-IU]) ON tblFSOTeams.[Org Number] = tblInventoryUnit.[Parent ORG]) ON tblSPSTeams.[Account Number] = tblVehicle.[Insurance Account]
- 第一步执行最内层
tblInventoryUnit和tblVehicle的内连接:仅保留两表ORG-IU字段相等的行,生成中间结果集A,包含两个表的所有字段 - 第二步执行中间层
tblFSOTeams和结果集A的内连接:仅保留tblFSOTeams.Org Number与结果集A中tblInventoryUnit.Parent ORG相等的行,生成中间结果集B,包含三个表的所有字段 - 第三步执行最外层
tblSPSTeams和结果集B的右连接:保留结果集B的所有行,匹配tblSPSTeams.Account Number与结果集B中tblVehicle.Insurance Account相等的记录,匹配不到的tblSPSTeams字段自动填充NULL
改写正确性验证
你整理的SQL Server写法完全等价:A RIGHT JOIN B的逻辑天然等价于B LEFT JOIN A,你将连接顺序调整为以tblVehicle为主表先左连tblSPSTeams,再内连另外两个表,连接条件和过滤条件均未修改,返回结果和原Access SQL完全一致。
可选优化建议:WHERE子句中多个
OR连接的状态判断可以替换为IN写法,代码更简洁易读:tblVehicle.[Vehicle Status] IN ('Pending - Motor Pool', 'Active - In Use', 'Active - Unlocated', 'Active - Surplused')
内容的提问来源于stack exchange,提问作者done_merson
相关产品推荐
相关产品推荐

