首页 > 解决方案 > 使用 LEFT OUTER JOIN 的 SQL 查询语法错误

问题描述

我正在尝试执行以下过程,我有两个不同的访问数据库,并且我正在将一些 sql 查询编程到 Excel Vba 中以操作这些数据库的数据。我使用 ADOX Connection 与这些数据库进行了链接,您可以看到下面的脚本。我的问题与查询本身有关,从一个表中我有很多数据,我正在从另一个表中查找这些数据,这些数据位于另一个数据库中,但是如果查询没有找到关系,它必须通知所有从第一个表中获取数据,并使用其他表作为补充信息,如果没有匹配,则结果将为空。

为了做这样的事情,我LEFT OUTER JOIN在所有桌子上都使用了,但它不适合。当它返回消息时

“JOIN 操作的语法错误”

我该如何解决这个错误?

Public Function getUMEByIdent()
Dim i As Long
Dim j As Integer
Dim nData() As Variant
Dim adox_table1 As ADOX.Table
Dim adox_table2 As ADOX.Table
Dim adox_table3 As ADOX.Table
Dim fatorConv As Double

With connection
    .ConectDB ("compDraw.mdb")
        Set adox_catalog = New ADOX.Catalog
        Set adox_catalog.ActiveConnection = connection.conn
        
        Set adox_table1 = New ADOX.Table
        With adox_table1
            Set .ParentCatalog = adox_catalog
            .Name = "lkdTbl1"
            .Properties("Jet OLEDB:Link Datasource") = ThisWorkbook.Path & "\assets\configs.mdb"
            .Properties("Jet OLEDB:Link Provider String") = "MS Access"
            .Properties("Jet OLEDB:Remote Table Name") = "mditems"
            .Properties("Jet OLEDB:Create Link") = True
        End With
    
        Set adox_table2 = New ADOX.Table
        With adox_table2
            Set .ParentCatalog = adox_catalog
            .Name = "lkdTbl2"
            .Properties("Jet OLEDB:Link Datasource") = ThisWorkbook.Path & "\assets\configs.mdb"
            .Properties("Jet OLEDB:Link Provider String") = "MS Access"
            .Properties("Jet OLEDB:Remote Table Name") = "umestatistics"
            .Properties("Jet OLEDB:Create Link") = True
        End With

        Set adox_table3 = New ADOX.Table
        With adox_table3
            Set .ParentCatalog = adox_catalog
            .Name = "lkdTbl3"
            .Properties("Jet OLEDB:Link Datasource") = ThisWorkbook.Path & "\assets\configs.mdb"
            .Properties("Jet OLEDB:Link Provider String") = "MS Access"
            .Properties("Jet OLEDB:Remote Table Name") = "convume"
            .Properties("Jet OLEDB:Create Link") = True
        End With
        
        Set .rs = .conn.Execute( _
            "SELECT bom.ident_mp, lkdTbl1.ncm, lkdTbl1.umc, lkdTbl2.ume, lkdTbl3.fator_conv FROM" & _
            " ((bom LEFT OUTER JOIN lkdTbl1 ON lkdTbl1.ident = bom.ident_mp) " & _
            " LEFT OUTER JOIN tkdTbl2 ON lkdTb1.ncm = lkdTbl2.ncm)" & _
            " LEFT OUTER JOIN lkdTbl3 ON lkdTbl1.umc = lkdTbl3.umc AND lkdTbl2.ume = lkdTbl3.ume" & _
            " GROUP BY bom.ident_mp, lkdTbl1.ncm, lkdTbl1.umc, lkdTbl2.ume, lkdTbl3.fator_conv", , adCmdText)
    
        Do While Not .rs.EOF
            If IsNull(.rs.Fields("ident_mp").Value) = False Then
                ReDim Preserve nData(i)
                nData(i) = Array(.rs.Fields("ident_mp").Value, .rs.Fields("ncm").Value, .rs.Fields("umc").Value, .rs.Fields("ume").Value, .rs.Fields("fator_conv").Value)
                i = i + 1
            End If
            
            .rs.MoveNext
        Loop
        .rs.Close
    
        adox_catalog.Tables.Delete "lkdTbl1"
        adox_catalog.Tables.Delete "lkdTbl2"
        adox_catalog.Tables.Delete "lkdTbl3"
    .FechaDb
End With
End Function

标签: excelvba

解决方案


Access 的查询解析器无法处理某些连接。您通常可以通过创建子查询来解决它。

SELECT   temp.ident_mp
       , temp.ncm
       , temp.umc
       , temp.ume
       , lkdTbl3.fator_conv
FROM
         (SELECT *
          FROM   bom
                 LEFT OUTER JOIN lkdTbl1 ON
                     lkdTbl1.ident = bom.ident_mp
                 LEFT OUTER JOIN tkdTbl2 ON
                     lkdTb1.ncm = lkdTbl2.ncm) temp
         LEFT OUTER JOIN lkdTbl3 ON
             temp.umc = lkdTbl3.umc
             AND temp.ume = lkdTbl3.ume
GROUP BY temp.ident_mp
       , temp.ncm
       , temp.umc
       , temp.ume
       , lkdTbl3.fator_conv

这会将前两个左连接放入一个名为的子查询temp中,以便最后一个左连接只连接两个表。我无法测试它,因为我没有您的设置,但我在 Northwind.mdb 中做了类似的事情并且它有效。


推荐阅读