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的结果包裹起来,否则会触发语法错误。另外最初的写法还存在两个问题:
- 重复使用
FROM关键字,一个SELECT语句只能有一个主FROM子句 - 关联条件中出现笔误:
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
相关产品推荐
相关产品推荐

