gpt4 book ai didi

excel - 使用 LEFT OUTER JOIN 的 SQL 查询语法错误

转载 作者:行者123 更新时间:2023-12-04 20:50:21 30 4
gpt4 key购买 nike

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

"Syntax Error on JOIN operation"


我该如何解决这个错误?
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 中做了类似的事情并且它有效。

关于excel - 使用 LEFT OUTER JOIN 的 SQL 查询语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65498555/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com