当我在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中创建这种关系?
发布于 2021-03-29 14:37:25
更新:
再看一看,您将需要relation对象的属性值。问题是,属性常量是按位的,在文档中有点难以捉摸。您看到的默认值是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
您创建的关系应该显示您需要的属性值。还有一个引用,您可以使用这里。
现在,当您创建自己的关系时,只需使用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
例如,如果您想要一个左联接,则为“attribute”设置的值将是dbRelationLeft +另一个属性常量的组合,表示为一个数值。
https://stackoverflow.com/questions/66862356
复制相似问题