在 SQL SELECT 查询中指定 2 个数据源
Specifying 2 DataSources in SQL SELECT Query
我有一个 SQL SELECT 查询,我在其中加入了位于不同文件夹中的 2 个或更多不同的 CSV 文件。我在 Excel VBA 中使用 ADO。我如何指定 ADO 连接字符串的数据源参数以接受 2 个不同的路径?
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDataSource1 &","& strDataSource2 & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
SQL 查询:
SELECT * FROM [FILE1.CSV] AS F1 INNER JOIN [FILE2.CSV] AS F2 ON F1.ID = F2.ID
下面是在一个查询中使用两个单独文件的示例代码。
Address.csv
Name,Address
Bruce,Dayton
Tony,10880 Malibu Point
Peter,20 Ingram Street
Names.csv
Name,Age
Bruce,49
Tony,48
Peter,28
会 return:
Sub test()
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "DBQ=C:\;Driver={Microsoft Text Driver (*.txt; *.csv)};MaxScanRows=8;"
'/ Update file paths accordingly
strSql = "Select n.*, a.[Address] " & _
"From C:\Folder\With\File\containing\Names.csv n " & _
"INNER JOIN C:\Folder\With\File\containing\Address.csv a " & _
"ON n.Name = a.Name "
oCon.Open strCon
Set oRs = oCon.Execute(strSql)
Sheet1.UsedRange.EntireRow.Delete
Sheet1.Cells(1).CopyFromRecordset oRs
End Sub
我终于让它工作了,并且还能够解决 Power Query FROWN 错误问题(下面列出)。
See the syntax of enclosing the filepath using back-ticks
. Also the
INNER JOIN gets replaced with a "," and the ON gets replaced with a
WHERE Clause.
列出我采取的步骤:
- 删除了 Excel 工作簿中的所有 Power Queries。
- 安装了最新的 Office。
- 2016 年 9 月 3 日从以下 MS 站点更新。重新启动我的系统。
- 已使用 Microsoft Access 文本驱动程序。您也可以使用 ADO ACE.OLEDB.12 但遵循相同的语法 用于 CSV 文件 .
第 2 点和/或第 3 点可能已经解决了问题,因为我看不到它在 MS 站点上的记录(我的试错)。
对于可能遇到同样问题的人:
SQL 查询语法如下面的代码所示。我还能够将相同的 SYNTAX 与 ACE.OLEDB.12 Driver 一起使用,并且在这两种情况下都可以快速且良好地工作。
Option Explicit
Sub test()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & ThisWorkbook.Path & ";Extensions=asc,csv,tab,txt;"
strSql = "SELECT n.*,a.[Address] "
strSql = strSql & " FROM `C:\Users\adam\Downloads`\Names.csv n"
strSql = strSql & ","
strSql = strSql & "`C:\Users\adam\Documents\TEST FOLDER`\Address.csv a"
strSql = strSql & " WHERE n.Name= a.Name"
oCon.Open strCon
Set oRs = Nothing
Set oRs = oCon.Execute(strSql)
' Sheet1.UsedRange.EntireRow.Delete
' Sheet1.Cells(1).CopyFromRecordset oRs
Dim oQT As QueryTable
On Error Resume Next
For Each oQT In Sheet1.QueryTables
oQT.Delete
Next oQT
Sheet1.ListObjects(1).Delete
On Error GoTo 0
Set oQT = Sheet1.ListObjects.Add(xlSrcQuery, oRs, Destination:=Sheet1.Cells(1, 1)).QueryTable
With oQT
.BackgroundQuery = False
.Refresh
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
我有一个 SQL SELECT 查询,我在其中加入了位于不同文件夹中的 2 个或更多不同的 CSV 文件。我在 Excel VBA 中使用 ADO。我如何指定 ADO 连接字符串的数据源参数以接受 2 个不同的路径?
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDataSource1 &","& strDataSource2 & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
SQL 查询:
SELECT * FROM [FILE1.CSV] AS F1 INNER JOIN [FILE2.CSV] AS F2 ON F1.ID = F2.ID
下面是在一个查询中使用两个单独文件的示例代码。
Address.csv
Name,Address
Bruce,Dayton
Tony,10880 Malibu Point
Peter,20 Ingram Street
Names.csv
Name,Age
Bruce,49
Tony,48
Peter,28
会 return:
Sub test()
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "DBQ=C:\;Driver={Microsoft Text Driver (*.txt; *.csv)};MaxScanRows=8;"
'/ Update file paths accordingly
strSql = "Select n.*, a.[Address] " & _
"From C:\Folder\With\File\containing\Names.csv n " & _
"INNER JOIN C:\Folder\With\File\containing\Address.csv a " & _
"ON n.Name = a.Name "
oCon.Open strCon
Set oRs = oCon.Execute(strSql)
Sheet1.UsedRange.EntireRow.Delete
Sheet1.Cells(1).CopyFromRecordset oRs
End Sub
我终于让它工作了,并且还能够解决 Power Query FROWN 错误问题(下面列出)。
See the syntax of enclosing the filepath using
back-ticks
. Also the INNER JOIN gets replaced with a "," and the ON gets replaced with a WHERE Clause.
列出我采取的步骤:
- 删除了 Excel 工作簿中的所有 Power Queries。
- 安装了最新的 Office。
- 2016 年 9 月 3 日从以下 MS 站点更新。重新启动我的系统。
- 已使用 Microsoft Access 文本驱动程序。您也可以使用 ADO ACE.OLEDB.12 但遵循相同的语法 用于 CSV 文件 .
第 2 点和/或第 3 点可能已经解决了问题,因为我看不到它在 MS 站点上的记录(我的试错)。
对于可能遇到同样问题的人:
SQL 查询语法如下面的代码所示。我还能够将相同的 SYNTAX 与 ACE.OLEDB.12 Driver 一起使用,并且在这两种情况下都可以快速且良好地工作。
Option Explicit
Sub test()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & ThisWorkbook.Path & ";Extensions=asc,csv,tab,txt;"
strSql = "SELECT n.*,a.[Address] "
strSql = strSql & " FROM `C:\Users\adam\Downloads`\Names.csv n"
strSql = strSql & ","
strSql = strSql & "`C:\Users\adam\Documents\TEST FOLDER`\Address.csv a"
strSql = strSql & " WHERE n.Name= a.Name"
oCon.Open strCon
Set oRs = Nothing
Set oRs = oCon.Execute(strSql)
' Sheet1.UsedRange.EntireRow.Delete
' Sheet1.Cells(1).CopyFromRecordset oRs
Dim oQT As QueryTable
On Error Resume Next
For Each oQT In Sheet1.QueryTables
oQT.Delete
Next oQT
Sheet1.ListObjects(1).Delete
On Error GoTo 0
Set oQT = Sheet1.ListObjects.Add(xlSrcQuery, oRs, Destination:=Sheet1.Cells(1, 1)).QueryTable
With oQT
.BackgroundQuery = False
.Refresh
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub