访问VBA“联接操作中的语法错误”

时间:2018-06-26 13:26:02

标签: sql vba ms-access ms-access-2010

我试图将SELECT查询附加到Access中的VBA对象,但我不断收到错误消息:

  

Join操作中的语法错误

Dim sql As String
sql = "SELECT R_History.iteration, R.RuntimeID, Policylanguage.FormBody " & _
      "FROM PolicyLanguage " & _
      "INNER JOIN ([Policy&Elements] " & _
      "INNER JOIN ((R " & _
      "INNER JOIN R_History " & _
      "ON (R.RunTimeID = R_History.RunTimeID " & _
      "AND (R.ReportID = R_History.ReportID)) " & _
      "INNER JOIN StatePolicyLanguage " & _
      "ON R_History.Iteration = StatePolicyLanguage.Iteration) " & _
      "ON [Policy&Elements].[Text&ElementID] = StatePolicyLanguage.[TextID&ElementID] " & _
      "ON PolicyLanguage.TextID = [Policy&Elements].TextID " & _
      "WHERE (((R.RuntimeID) = Dlast('runtimeID','r')));"
DoCmd.RunSQL (sql)

我无法让它在我的绝对生命中运行。谁能告诉我是怎么回事?

编辑:这是我尝试模仿的代码 enter image description here

1 个答案:

答案 0 :(得分:0)

如果您运行的查询中,条件是以表格形式输入的值(例如field1 = frm1.txtValue),则可以创建一个参数化查询,将传递的参数添加到WHERE子句中。这样,您就不必在VBA中创建SQL了-您只需要在VBA中设置参数即可。

正如其他人所指出的,Access要求您在每个联接之后加上括号:

from (((Table1
    inner join Table2 on Table2.field1 = Table1.field1)
    inner join Table3 on Table3.field2 = Table2.field2)
    inner join Table4 on Table4.field3 = Table3.field3)

因此,正如其他人所建议的那样,如果您绝对需要通过VBA构造查询,请将JOIN和ON子句放在一起以防止混淆,并添加必要的括号。

我发现当您必须在Access中(在SQL编辑器或VBA中)创建复杂的查询时,在支持语法突出显示等功能的更友好的编辑器(例如Notepad ++)中编写SQL可能会有所帮助。 。然后,您可以将查询粘贴到需要的地方。