在SQL SELECT查询中指定2个数据源

问题描述 投票:0回答:2

我有一个SQL SELECT查询,其中我要加入2个或更多位于不同文件夹中的不同CSV文件。我在Excel VBA中使用ADO。如何指定ADO连接字符串的DataSource参数以接受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
sql excel vba datasource connection-string
2个回答
2
投票

这是在一个查询中使用两个单独文件的示例代码。

Address.csv

Name,Address
Bruce,Dayton
Tony,10880 Malibu Point
Peter,20 Ingram Street

Names.csv

Name,Age
Bruce,49
Tony,48
Peter,28

将返回:


enter image description here

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

0
投票

我终于使它工作了,并且还能够解决Power Query FROWN Error问题(在下面列出)。

请参见使用back-ticks括起文件路径的语法。还有INNER JOIN被替换为“,”,而ON被替换为WHERE条款。

列出我采取的步骤:

  1. [删除了Excel工作簿中的所有超级查询。
  2. 已安装最新的Office。
  3. 2016年9月3日来自以下MS网站的更新。重新启动了我的系统。
  4. 使用的Microsoft Access文本驱动程序。您也可以使用ADO ACE.OLEDB.12,但遵循相同的语法对于CSV文件

[第二和/或第三点可能已经解决了该问题,因为我看不到它在MS网站上有记录(我的试验和错误)。

对于可能面临相同问题的人:

SQL QUERY SYNTAX如下面的代码所示。我还可以将相同的SYNTAX与ACE.OLEDB.12驱动程序一起使用,并且在两种情况下均可以快速而良好地工作。

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
© www.soinside.com 2019 - 2024. All rights reserved.