在 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.

列出我采取的步骤:

  1. 删除了 Excel 工作簿中的所有 Power Queries。
  2. 安装了最新的 Office。
  3. 2016 年 9 月 3 日从以下 MS 站点更新。重新启动我的系统。
  4. 已使用 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