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 在以下位置提供了有关此过程的文档:
- ALTER TABLE statement (Microsoft Access SQL)
- CONSTRAINT clause (Microsoft Access SQL)
- Modify a table's design using Access SQL
- Create Foreign Key Relationships
还有关于如何在 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 + 另一个表示为一个数值的属性常量的组合。
当我在 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 在以下位置提供了有关此过程的文档:
- ALTER TABLE statement (Microsoft Access SQL)
- CONSTRAINT clause (Microsoft Access SQL)
- Modify a table's design using Access SQL
- Create Foreign Key Relationships
还有关于如何在 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 + 另一个表示为一个数值的属性常量的组合。