MS Access:如何在 VBA 中设置外连接约束?

问题描述

当我在 Database Tools > Relationships 处手动创建两个表之间的关系时,Access 允许我设置联接属性,使其成为内联接或左外联接或右外联接加入

enter image description here

但是当我在 VBA 中创建关系时:

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

它将关系创建为内部联接。我可以通过转到 Database Tools > Relationships 并查看 VBA 创建的关系来看到这一点:

enter image description here

我没有看到告诉 VBA 使用什么连接属性方法,它显然自己决定进行内部连接。 (另一个问题是连接线左侧的小无穷大符号意味着Access认为这是一对多关系,但由于链接字段是主键,因此是一对一的,如图所示在上面的第一张图片中。)

Microsoft 在以下位置提供了有关此过程的文档:

还有关于如何在 DAO 而非 sql 中执行此操作的文档:

我没有看到任何允许我选择连接属性内容

我需要表关系是外连接,以便它包括一个表的所有记录,并且只包括主键相等的第二个表的记录。如何在 VBA 中创建这种关系?

解决方法

更新:

再看这个,你将需要关系对象的属性值。 问题是,属性常量是按位的,在文档中有点难以捉摸。 0 是您看到的默认值,其余的必须相加。

所以你可以这样做:

以您想要的方式(左连接、右连接等)在您的数据库中创建关系并保存。假设 Northwind 是您的数据库,在函数或模块中:

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

您创建的关系应显示您需要的属性值。 您还可以使用 here 参考。

现在,当您要创建自己的关系时,只需使用 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 + 另一个表示为一个数值的属性常量的组合。