Как создать действительный оператор FindFirst, когда два поля имеют одно и то же имя после внутреннего объединения? - PullRequest
1 голос
/ 29 ноября 2011

Я создаю набор DAO.Recordset таким образом:

Set recJoined=MyDB.OpenRecordSet(" Select * From TableA Inner Join TableB On TableA.FieldA=TableB.FieldA")

Проблема в том, что в таблицах A и B много полей, и некоторые из них с одинаковыми именами.

I сейчасхотите выбрать запись с помощью

recJoined.FindFirst FieldA="100"

Конечно, это не получается, потому что 'FieldA' не относится к уникальному полю.Однако, когда я изменяю критерии на:

recJoined.FindFirst TableA.FieldA="100" 

, я сталкиваюсь с ошибкой «неизвестная или неверная ссылка на поле».

Я мог бы указать псевдоним для поля TableA.FieldA, конечно, воператор Select, но так как мне нужны все поля из TableA и TableB и их много, это действительно было бы очень громоздко.

Как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Есть два способа справиться с этим.

1 - Не использовать SELECT *.Всегда указывайте нужные вам столбцы.(обычно столбцы с одинаковыми именами находятся в столбцах соединения, которые обычно содержат одни и те же данные) Если вам действительно нужен один и тот же именованный столбец дважды, вы можете использовать их псевдонимы, чтобы было легко предсказать, каким будет имя.

Select TableA.FieldA as TableA_FieldA, 
       TableB.FieldA as TableB_FieldA...

тогда вы можете сделать

 recJoined.FindFirst "TableA_FieldA='100'"

2 - Если вам нужно использовать SELECT * Вы можете узнать, какие имена полей сначала в пустом месте, а затем использовать любое имязаключается в том, что ядро ​​базы данных присвоило его, а затем использует эти результаты

 Dim fld As DAO.Field
 For Each fld In recJoined.Fields
    Debug.Print fld.Name
  Next fld

С MS Access или SQL Server это будет производить что-то вроде

 TableA.FieldA
 FieldB
 ...
 TableB.FieldA
 FieldC

Что означает, что вы можете сделать это

  recJoined.FindFirst "TableA.FieldA='100'"
0 голосов
/ 30 ноября 2011

Я проголосовал за ответ Конрада, но не могу принять его, поскольку он не отвечает моей конкретной необходимости: иметь возможность выбрать все поля, не зная точно, что это такое, но имея возможность псевдоним столбца Соединение.

(обычно столбцы с одинаковыми именами находятся в столбцах соединения, которые обычно содержат одинаковые данные)

Это верно, конечно, но оператор FindFirst не видит его так, он требует уникальный спецификатор и выдает ошибку.

2 - Если вам нужно использовать SELECT *, вы можете узнать, какие имена полей сначала в чистом виде, а затем использовать любое имя, которое было присвоено ему ядром базы данных, а затем использовать эти результаты

Имя просто FieldA без каких-либо дополнительных уточнений или префиксов. Так что это не поможет.

Учтите, что SELECT *, TableA.FieldA AS TableA_FieldA, является действительным

Да, это так! и это приводит к решению. Но у результирующего набора FieldA теперь дважды: один раз с псевдонимом, один раз с исходным именем. Поле «Псевдоним» является обновляемым, исходное поле - нет. Как только я позаботился о том, чтобы не обновлять поле FieldA, все было в порядке.

...