excel - 使用 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
解决方案
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 中做了类似的事情并且它有效。
推荐阅读
- database - 我如何在这里规范化/制定数据库设计?
- javascript - 使用 select() 复制值并复制
- python - Python-如何检查一个单词是否有小写和大写
- javascript - 使用 jquery/ajax 动态填充下拉列表
- vb6 - VB6 从 Recordset 插入表
- node.js - 来自点击的 AJAX 调用失败
- .htaccess - RewriteRule htaccess 不适用于长参数
- android - 在使用 Espresso 进行测试时,如何登录我的应用程序一次然后执行所有测试套件?目前,每次测试都会重新启动应用程序
- shell - 使用 zsh 时,preexec: parse error in zsh?
- php - 如何在 PHP 中生成带有特定字母的 ID 并添加数字?