Указание 2 источников данных в запросе SQL SELECT - PullRequest
0 голосов
/ 03 октября 2019

У меня есть SQL-запрос SELECT, в котором я объединяю 2 или более разных файлов CSV, расположенных в разных папках. Я использую ADO в Excel VBA. Как указать параметр источника данных строки подключения ADO для принятия двух разных путей?

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

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вот пример кода, использующего два отдельных файла в одном запросе.

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 голосов
/ 06 октября 2019

Я наконец заставил его работать и также смог решить Ошибка FROWN Power Query Error (список приведен ниже).

См. Синтаксис включения пути к файлу, используя back-ticks. Также INNER JOIN заменяется на ",", а ON заменяется на WHERE предложение.

Перечисление шагов, которые я предпринял:

  1. Удалены все Power Queries в книге Excel.
  2. Установлены последние версии Office.
  3. 2016 Обновления 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
...