Синтаксис ADODB SQL — доступ к внутреннему соединению таблицы с помощью листа Excel

#sql #excel #vba #ms-access #adodb

#sql #excel #vba #ms-access #adodb

Вопрос:

У меня есть проект, в котором пользователям нужно будет заполнить файл Excel, а затем экспортировать данные в базу данных Access. Данные, собранные в файле Excel, необходимо будет экспортировать в 3 этапа: (1) экспортировать запись набора данных 1, (2) запросить доступ к первичному ключу (автономер) вновь импортированной записи, (3) экспортировать запись набора данных 2, которая включает заполненный первичный ключ в качестве внешнего ключа.

Я могу выполнить первый шаг, установив и открыв соединение ADODB. Однако я сталкиваюсь с проблемами на втором шаге, когда мне нужно выполнить внутреннее соединение в таблице Access и Excel.

 wlodb.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:Users" amp;userSID amp; "DesktopWLO Ramp;C Database_10-4-16.accdb"

sqlFindREMPK = "Select ID " _
amp; "FROM [test1] a " _
amp; "INNER JOIN [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:UserRED-WIP.xlsm].[REM Upload$] b " _
amp; "ON a.[REM_ID_Database] = b.[REM_ID_Database] " _
amp; "WHERE (((a.[REM_ID_Database])=""REM9811044""));"

WLOrs.Open sqlFindREMPK, wlodb

ActiveSheet.Range("A10").CopyFromRecordset (WLOrs)
 

Имя таблицы и рабочего листа имеют одинаковые имена полей. Проблема связана с предложением SELECT . Если я оставлю все как есть, я получу сообщение об ошибке, в котором говорится, что поле может ссылаться на более чем одну таблицу в предложении FROM . Если я добавлю имя таблицы, например [test1].[ID] затем я получу сообщение о том, что для требуемых параметров не задано значение. Если я немного изменю имя поля Excel на ID1 и оставлю предложение SELECT как просто ID, код будет работать нормально.

Комментарии:

1. Вы пробовали использовать псевдоним select a.ID ?

2. Это сработало. Я не думал об использовании псевдонима, прежде чем объявлять его в предложении FROM . Кажется немного нелогичным, но это сработало.

Ответ №1:

Как только вы предоставляете псевдоним для таблицы, вы должны использовать этот псевдоним при обращении к этой таблице. Вы больше не можете получить доступ к таблице по ее первоначальному имени.

 sqlFindREMPK = "Select a.ID " _
  amp; "FROM [test1] a " _
  amp; "INNER JOIN [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:UserRED-WIP.xlsm].[REM Upload$] b " _
  amp; "ON a.[REM_ID_Database] = b.[REM_ID_Database] " _
  amp; "WHERE (((a.[REM_ID_Database])=""REM9811044""));"
 

Комментарии:

1. В качестве альтернативы, мы могли бы нажать @sgeddes, чтобы дать на этот старый вопрос новый ответ!