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

MS Access中LEFT JOIN查询语法错误问题求助

解决MS Access多表LEFT JOIN语法错误问题

问题场景

编写MS Access的SQL查询时遇到语法错误,以下是两种尝试的写法及错误提示:

最初使用的SQL语句

SELECT fa.Filiale_ID, fa.Datum_Beauftragung, fa.Auftragstyp, fad.Tiefbau, fh.HW_ID, fh.Anzahl
FROM Filiale_Aufträge AS fa LEFT JOIN Filiale_Auftragsdaten AS fad ON fa.Filiale_ID = fad.Filiale_ID
FROM Filiale_Aufträge AS fa LEFT JOIN Filiale_Hardware AS fh ON fa-Filiale_ID = fh.Filiale_ID
WHERE (((fa.Filiale_ID) Not In (SELECT Filiale_ID
  FROM Filiale_Aufträge
  WHERE Auftragstyp IN ('Aufbau', 'Service', 'Aufbau vorl', 'Fertigfundamente', 'Integration Bestand',  'Parkplatzmakierungen', 'RFID-Karten', 'Roaming', 'Hardware') 

)) AND ((fa.Datum_Beauftragung) Is Not Null) AND ((fa.Auftragstyp)='Begehung') AND ((fad.Tiefbau)='Ja' Or (fad.Tiefbau)='Nein'));

尝试的第二种写法

SELECT fa.Filiale_ID, fa.Datum_Beauftragung, fa.Auftragstyp, fad.Tiefbau, fh.HW_ID, fh.Anzahl
FROM Filiale_Aufträge AS fa 
LEFT JOIN 
    (SELECT Filiale_ID, Tiefbau 
     FROM Filiale_Auftragsdaten) 
     AS fad ON fa.Filiale_ID = fad.Filiale_ID
LEFT JOIN 
    (SELECT Filiale_ID, HW_ID, Anzahl 
     FROM Filiale_Hardware) 
     AS fh ON fa.Filiale_ID = fh.Filiale_ID
WHERE 
    fa.Filiale_ID NOT IN (
        SELECT Filiale_ID
        FROM Filiale_Aufträge
        WHERE Auftragstyp IN ('Aufbau', 'Service', 'Aufbau vorl', 'Fertigfundamente', 'Integration Bestand', 'Parkplatzmakierungen', 'RFID-Karten', 'Roaming', 'Hardware')
    )
    AND fa.Datum_Beauftragung IS NOT NULL 
    AND fa.Auftragstyp = 'Begehung' 
    AND (fad.Tiefbau = 'Ja' OR fad.Tiefbau = 'Nein');

错误提示

Syntax error (missing operator) in query expression"fa.Filiale_ID = fad.Filiale_ID FROM Filiale_Aufträge AS fa LEFT JOIN Filiale_Hardware AS fh ON fa.Filiale_ID = fh.Filiale_I"

问题分析

MS Access的Jet SQL语法对多表JOIN有特殊要求:当连接多个表时,必须用括号将前一个JOIN的结果包裹起来,否则会触发语法错误。另外最初的写法还存在两个问题:

  1. 重复使用FROM关键字,一个SELECT语句只能有一个主FROM子句
  2. 关联条件中出现笔误:fa-Filiale_ID应该是fa.Filiale_ID(点号而非减号)

修正后的SQL语句

SELECT fa.Filiale_ID, fa.Datum_Beauftragung, fa.Auftragstyp, fad.Tiefbau, fh.HW_ID, fh.Anzahl
FROM (Filiale_Aufträge AS fa 
LEFT JOIN Filiale_Auftragsdaten AS fad ON fa.Filiale_ID = fad.Filiale_ID)
LEFT JOIN Filiale_Hardware AS fh ON fa.Filiale_ID = fh.Filiale_ID
WHERE 
    fa.Filiale_ID NOT IN (
        SELECT Filiale_ID
        FROM Filiale_Aufträge
        WHERE Auftragstyp IN ('Aufbau', 'Service', 'Aufbau vorl', 'Fertigfundamente', 'Integration Bestand', 'Parkplatzmakierungen', 'RFID-Karten', 'Roaming', 'Hardware')
    )
    AND fa.Datum_Beauftragung IS NOT NULL 
    AND fa.Auftragstyp = 'Begehung' 
    AND (fad.Tiefbau = 'Ja' OR fad.Tiefbau = 'Nein');

如果使用子查询的写法,同样需要用括号包裹JOIN层级:

SELECT fa.Filiale_ID, fa.Datum_Beauftragung, fa.Auftragstyp, fad.Tiefbau, fh.HW_ID, fh.Anzahl
FROM (Filiale_Aufträge AS fa 
LEFT JOIN 
    (SELECT Filiale_ID, Tiefbau FROM Filiale_Auftragsdaten) AS fad 
    ON fa.Filiale_ID = fad.Filiale_ID)
LEFT JOIN 
    (SELECT Filiale_ID, HW_ID, Anzahl FROM Filiale_Hardware) AS fh 
    ON fa.Filiale_ID = fh.Filiale_ID
WHERE 
    fa.Filiale_ID NOT IN (
        SELECT Filiale_ID
        FROM Filiale_Aufträge
        WHERE Auftragstyp IN ('Aufbau', 'Service', 'Aufbau vorl', 'Fertigfundamente', 'Integration Bestand', 'Parkplatzmakierungen', 'RFID-Karten', 'Roaming', 'Hardware')
    )
    AND fa.Datum_Beauftragung IS NOT NULL 
    AND fa.Auftragstyp = 'Begehung' 
    AND (fad.Tiefbau = 'Ja' OR fad.Tiefbau = 'Nein');

关键说明

  • MS Access要求多表连续JOIN时,必须用括号明确JOIN的优先级,将前一个JOIN组合作为整体再进行下一个JOIN
  • 确保关联条件中的字段引用正确,避免符号错误(如将点号写成减号)
  • 单个SELECT语句只能有一个主FROM子句,不能重复声明

内容的提问来源于stack exchange,提问作者Johannes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:14:54