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

MS Access: How to set outer join in constraint in VBA?

当我在 Database Tools > Relationships 手动创建两个 table 之间的关系时,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:

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

我需要 table 关系是一个外连接,这样它包含一个 table 的所有记录,并且只包含第二个 table 的记录,其中主键是平等的。如何在 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 + 另一个表示为一个数值的属性常量的组合。