SQL Server子查询中使用Left Join出现语法错误如何解决
语法错误诱因
- 缺少查询的基础数据源定义:你提供的SQL片段仅为JOIN关联部分,没有声明最基础的查询主表/主数据源。如果你的需求是直接关联两个子查询,需要将第一个子查询放在
FROM关键字后作为主数据源,不能直接以(开头写子查询后直接接ON关联条件。 - 关联条件不符合表结构定义:你给出的表结构中,
tbl_ShipmentAPAR的主键为VendorID,tbl_vendors的外键为FK_VendorID,原SQL中LEFT JOIN的关联条件写反,且未加表前缀导致字段歧义。
修正代码
根据不同使用场景可选对应修正方案:
场景1:需要关联额外订单主表(含PK_OrderNo字段)
假设订单主表为tbl_Orders,替换为你实际的主表名即可:
SELECT -- 此处补充你需要查询的输出字段 o.PK_OrderNo, LHBase.LHVendor, DABase.DAVendor FROM tbl_Orders o -- 主表,替换为实际表名 LEFT JOIN ( SELECT t1.FK_OrderNo AS LHNo, t1.VendorName AS LHVendor FROM tbl_ShipmentAPAR t1 LEFT JOIN tbl_vendors t2 ON t1.VendorID = t2.FK_VendorID -- 修正关联条件匹配表结构 WHERE t2.FK_ServiceID = 'LH' ) LHBase ON o.PK_OrderNo = LHBase.LHNo LEFT JOIN ( SELECT t1.FK_OrderNo AS DANo, t1.VendorName AS DAVendor FROM tbl_ShipmentAPAR t1 LEFT JOIN tbl_vendors t2 ON t1.VendorID = t2.FK_VendorID -- 修正关联条件匹配表结构 WHERE t2.FK_ServiceId = 'DA' ) DABase ON o.PK_OrderNo = DABase.DANo
场景2:仅需要关联两个子查询,无额外主表
直接将第一个子查询作为主数据源即可:
SELECT -- 此处补充你需要查询的输出字段 LHBase.LHNo, LHBase.LHVendor, DABase.DAVendor FROM ( SELECT t1.FK_OrderNo AS LHNo, t1.VendorName AS LHVendor FROM tbl_ShipmentAPAR t1 LEFT JOIN tbl_vendors t2 ON t1.VendorID = t2.FK_VendorID WHERE t2.FK_ServiceID = 'LH' ) LHBase LEFT JOIN ( SELECT t1.FK_OrderNo AS DANo, t1.VendorName AS DAVendor FROM tbl_ShipmentAPAR t1 LEFT JOIN tbl_vendors t2 ON t1.VendorID = t2.FK_VendorID WHERE t2.FK_ServiceId = 'DA' ) DABase ON LHBase.LHNo = DABase.DANo
内容的提问来源于stack exchange,提问作者Najeeb KHAN
相关产品推荐
相关产品推荐

