MS Access: как установить ограничение внешнего соединения в VBA?

Когда я вручную создаю связь между двумя таблицами на Database Tools > Relationships, Access позволяет мне установить присоединиться к свойствам так, чтобы это было либо внутреннее соединение или левое или правое внешнее соединение:

MS Access: как установить ограничение внешнего соединения в VBA?

Но когда я создаю отношения в VBA:

sSQL = "ALTER TABLE [" & sTable1 & "] ADD CONSTRAINT [" & sTable1 & "] " & _
                "FOREIGN KEY ([" & sKey & "]) REFERENCES [" & sTable2 & "]([" & sKey & "]);"
oDB.Execute sSQL

он создает отношения как внутреннее соединение. Я могу убедиться в этом, перейдя на Database Tools > Relationships и посмотрев на отношения, созданные VBA:

MS Access: как установить ограничение внешнего соединения в VBA?

Я не вижу способа указать VBA, какие свойства соединения использовать, и, по-видимому, он сам решает создать внутреннее соединение. (Другая проблема заключается в том, что маленький символ бесконечности в левой части соединительной линии означает, что Access считает, что это отношение «один ко многим», но, поскольку связанные поля являются первичным ключом, они взаимно однозначны, как показано на первом изображении выше.)

У Microsoft есть документация по этому процессу по адресу:

  • Оператор ALTER TABLE (Microsoft Access SQL)
  • Предложение CONSTRAINT (Microsoft Access SQL)
  • Изменение дизайна таблицы с помощью Access SQL
  • Создание отношений внешнего ключа

Также есть документация о том, как это сделать в DAO вместо SQL:

  • Database.CreateRelation метод (DAO)

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновления:

Если посмотреть на это подробнее, вам понадобится значение атрибутов объекта отношения. Проблема в том, что константы атрибутов являются побитовыми и немного неуловимыми в документации. Значение по умолчанию, которое вы видите, равно 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 + другой константы атрибута, представленной как одно числовое значение.

Извините, я должен был сказать, что этот образ был создан в Database Tools > Relationships, а не в конструкторе запросов. Я отредактировал вопрос, чтобы прояснить это сейчас. Я знаю, что могу использовать SQL для установки свойств соединения в запросе, но я спрашиваю, как установить свойства соединения для связи таблицы в базе данных, а не в запросе.

NewSites 30.03.2021 02:49

Хорошо, имеет смысл. Взгляните на обновленный ответ и посмотрите, имеет ли он смысл. Основное заключение, конечно, заключается в том, что объекты отношений в Access управляются с помощью объектов доступа к данным, а не DDL sql, как в большинстве других механизмов sql.

Chuma 30.03.2021 03:35

Другие вопросы по теме