Когда я вручную создаю связь между двумя таблицами на Database Tools > Relationships
, Access позволяет мне установить присоединиться к свойствам так, чтобы это было либо внутреннее соединение или левое или правое внешнее соединение:
Но когда я создаю отношения в VBA:
sSQL = "ALTER TABLE [" & sTable1 & "] ADD CONSTRAINT [" & sTable1 & "] " & _
"FOREIGN KEY ([" & sKey & "]) REFERENCES [" & sTable2 & "]([" & sKey & "]);"
oDB.Execute sSQL
он создает отношения как внутреннее соединение. Я могу убедиться в этом, перейдя на Database Tools > Relationships
и посмотрев на отношения, созданные VBA:
Я не вижу способа указать VBA, какие свойства соединения использовать, и, по-видимому, он сам решает создать внутреннее соединение. (Другая проблема заключается в том, что маленький символ бесконечности в левой части соединительной линии означает, что Access считает, что это отношение «один ко многим», но, поскольку связанные поля являются первичным ключом, они взаимно однозначны, как показано на первом изображении выше.)
У Microsoft есть документация по этому процессу по адресу:
Также есть документация о том, как это сделать в DAO вместо SQL:
Я не вижу в этом ничего, что позволяло бы мне выбирать свойства соединения.
Мне нужно, чтобы отношение таблиц было внешним соединением, чтобы оно включало все записи одной таблицы и только записи второй таблицы, в которой первичные ключи равны. Как я могу создать эти отношения в VBA?
Обновления:
Если посмотреть на это подробнее, вам понадобится значение атрибутов объекта отношения. Проблема в том, что константы атрибутов являются побитовыми и немного неуловимыми в документации. Значение по умолчанию, которое вы видите, равно 0, а остальные должны быть добавлены.
Итак, вот что вы можете сделать:
Создайте отношения в своей базе данных так, как вы хотите (левое соединение, правое соединение и т. д.) И сохраните. Предположим, что ваша база данных - это северный ветер, в функции или модуле:
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
With dbsNorthwind
' Display the attributes of the Northwind database's
' relations.
Debug.Print "Attributes of relations in " & _
.Name & ":"
For Each relLoop In .Relations
Debug.Print " " & relLoop.Name & " = " & _
relLoop.Attributes
Next relLoop
.Close
End With
Созданное вами отношение должно отображать нужное вам значение атрибута. Также есть ссылка, по которой можно использовать здесь.
Теперь, когда вы собираетесь создать свое собственное отношение, вы просто используете функцию CreateRelation (как в документации) и устанавливаете нужные вам атрибуты следующим образом:
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
With dbsNorthwind
Set relNew = .CreateRelation(Name, Table, ForeignTable, Attributes)
' Add join fields
relNew.Fields.Append relNew.CreateField("newFieldName")
relNew.Fields!newFieldName.ForeignName = "joinfieldName"
.Relations.Append relNew
.Close
End With
Если, например, вам нужно левое соединение, значение, которое вы установили для «Атрибутов», будет комбинацией dbRelationLeft + другой константы атрибута, представленной как одно числовое значение.
Хорошо, имеет смысл. Взгляните на обновленный ответ и посмотрите, имеет ли он смысл. Основное заключение, конечно, заключается в том, что объекты отношений в Access управляются с помощью объектов доступа к данным, а не DDL sql, как в большинстве других механизмов sql.
Извините, я должен был сказать, что этот образ был создан в
Database Tools > Relationships
, а не в конструкторе запросов. Я отредактировал вопрос, чтобы прояснить это сейчас. Я знаю, что могу использовать SQL для установки свойств соединения в запросе, но я спрашиваю, как установить свойства соединения для связи таблицы в базе данных, а не в запросе.