[英]syntax error (missing operator) in query expression - VBA and Access
我使用以下语法构建查询:
SELECT e.codigo AS `Código`,
e.razao_social AS `Razão Social`,
e.grupo AS `Grupo`,
e.tributacao AS `Tributação`,
e.sistema AS `Sistema`,
r.nome AS `Responsável`,
date_format(t.competencia, '%m/%Y') AS `Competência`,
s.nome AS `Status`,
c.nome AS `Tipo Conferência`
FROM tarefa AS t
RIGHT JOIN empresa AS e ON t.id_empresa = e.id_empresa
LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel
LEFT JOIN status AS s ON t.id_status = s.id_status
LEFT JOIN conferencia AS c ON t.id_conferencia = c.id_conferencia
WHERE c.nome = 'Encerramento Contábil'
ORDER BY `Competencia`;
我在 MariaDB 中做了一个测试查询,它成功了。
现在,我使用 VBA MSExcel 在 Access 中使用此查询,它在表之间具有相同的结构和关系,但返回错误。
消息错误 vba:
表达式“t.id_empresa = e.id_empresa LEFT JOIN responsavel AS r ON t.id_respons”中的语法错误(缺少运算符)
这是我的代码 vba MSExcel:
Sub testSql()
'Creating objects of Connection and Recordset
Dim conn As New Connection, rec As New Recordset
Dim DBPATH, PRVD, connString, query As String
'Declaring fully qualified name of database. Change it with your database's location and name.
DBPATH = "C:\Users\ctb06\Documents\Database2.accdb"
'This is the connection provider. Remember this for your interview.
PRVD = "Microsoft.ace.OLEDB.12.0;"
'This is the connection string that you will require when opening the the connection.
connString = "Provider=" & PRVD & "Data Source=" & DBPATH
'opening the connection
conn.Open connString
'the query I want to run on the database.
query = "SELECT e.codigo AS `Código`, e.razao_social AS `Razão Social`, e.grupo AS `Grupo`, e.tributacao AS `Tributação`, e.sistema AS `Sistema`, r.nome AS `Responsável`, date_format(t.competencia, '%m/%Y') AS `Competência` FROM tarefa AS t RIGHT JOIN empresa AS e ON t.id_empresa = e.id_empresa LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel;"
'running the query on the open connection. It will get all the data in the rec object.
rec.Open query, conn
'clearing the content of the cells
Range("a1").Select
Cells.ClearContents
If (rec.RecordCount <> 0) Then
col = 1
For Each resp In rec.Fields
With Cells(1, col)
.Value = resp.Name
End With
col = col + 1
Next resp
Cells(2, 1).CopyFromRecordset rec
End If
rec.Close
conn.Close
End Sub
我在哪里失踪?
没有两个 SQL 方言是完全相同的,以实现精确的可转移性。 Simply, MariaDB's SQL will not perfectly align to MS Access' SQL similar to running same query from Oracle to Postgres, MySQL to SQL Server, Sybase to DB2... There will need to be some translation.
具体来说:
DATE_FORMAT
在 MS Access 中不是可用的 function。 而是使用具有不使用%
的适当格式模式的FORMAT
。
在 MS Access 中,不止一个JOIN
需要括号括起来。 但是, RIGHT JOIN
和LEFT JOIN
的混合可能需要嵌套连接。
(诚然,对于使用查询设计器而不是 SQL 构建复杂查询的新 Access 用户来说,这是一个令人沮丧的要求。我提出了这个建议的更改,其中包括 Access 的 SQL 方言。)
幸运的是,MS Access 支持反引号,尽管方括号[...]
是使用特殊字符或关键字转义标识符的更流行的形式。
考虑以下调整:
SELECT e.codigo AS `Código`,
e.razao_social AS `Razão Social`,
e.grupo AS `Grupo`,
e.tributacao AS `Tributação`,
e.sistema AS `Sistema`,
r.nome AS `Responsável`,
FORMAT(t.competencia, 'mm/yyyy') AS `Competência`,
s.nome AS `Status`,
c.nome AS `Tipo Conferência`
FROM ((((empresa AS e
RIGHT JOIN tarefa AS t ON t.id_empresa = e.id_empresa)
LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel)
LEFT JOIN status AS s ON t.id_status = s.id_status)
LEFT JOIN conferencia AS c ON t.id_conferencia = c.id_conferencia)
WHERE c.nome = 'Encerramento Contábil'
ORDER BY `Competencia`;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.