【问题标题】:MS Access: How to set outer join in constraint in VBA?MS Access:如何在 VBA 中设置外部连接约束?
【发布时间】:2021-03-29 22:16:08
【问题描述】:

当我在 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 中创建这种关系?

【问题讨论】:

    标签: sql vba ms-access constraints table-relationships


    【解决方案1】:

    更新:

    再看这个,您将需要关系对象的属性值。 问题是,属性常量是按位的,并且在文档中有点难以捉摸。值 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 中制作的,而不是在查询设计器中制作的。我已经编辑了这个问题,以便现在清楚。我知道我可以使用 SQL 在查询中设置连接属性,但我问的是如何在数据库中设置表关系的连接属性,而不是在查询中。
    • 好吧有道理。看看更新的答案,看看它是否有意义。当然,基本的总结是 Access 中的关系对象是通过数据访问对象而不是像大多数其他 sql 引擎中那样通过 DDL sql 操作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2014-12-12
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多