【问题标题】:syntax error (missing operator) in query expression - VBA and Access查询表达式中的语法错误(缺少运算符) - VBA 和 Access
【发布时间】:2021-03-14 12:33:03
【问题描述】:

我使用以下语法构建查询:

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

我错过了什么?

【问题讨论】:

  • RIGHT JOIN 与 LEFT JOIN 结合,以及那个 WHERE 子句...
  • MS-Access 在多个连接时需要括号。
  • @jarlh,所以我的查询需要这样吗?: query = ("SELECT e.codigo AS Código," _ & "e.razao_social AS Razão Social," _ ...

标签: sql excel vba ms-access


【解决方案1】:

没有两种 SQL 方言在精确可转移性方面完全相同。简单地说,MariaDB 的 SQL 不会与 MS Access 的 SQL 完全一致,类似于从 Oracle 到 Postgres、从 MySQL 到 SQL Server、从 Sybase 到 DB2 运行相同的查询......需要进行一些翻译。

具体来说:

  • DATE_FORMAT 不是 MS Access 中的可用功能。而是使用 FORMAT 与不使用 % 的适当格式模式。

  • 多个JOIN 需要在MS Access 中用括号括起来。但是,RIGHT JOINLEFT JOIN 的组合可能需要嵌套连接。

    (诚然,对于新的 Access 用户来说,使用查询设计器而不是 SQL 构建复杂查询是一个令人沮丧的要求。我将这个 suggested change 等提到了 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`;

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2023-03-12
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多