3 表连接的 MS Access VB SQL 语法

Posted

技术标签:

【中文标题】3 表连接的 MS Access VB SQL 语法【英文标题】:MS Access VB SQL Syntax for 3 Table Join 【发布时间】:2020-10-21 16:37:15 【问题描述】:

我一直在尝试创建一个包含来自 3 个表的信息的表单。在此表单上,我希望有一个过滤器组合框,以便用户可以选择一个成员类型,它会将列表过滤到具有该成员类型的成员。

我们数据库中的成员可以有不止一种类型。为此,我创建了一个 memberTable:

会员ID 名称 名字 等等

成员类型表:

会员类型ID 成员类型名称

和一个连接表 membermembertype:

会员ID 成员类型ID

我尝试使用许多不同的查询设置我的表单:

SELECT qryMemberType.MemberID, qryMemberType.FName, qryMemberType.SName, 
qryMemberType.MemberTypeName, qryMemberType.MemberTypeID FROM qryMemberType;

SELECT [member].[MemberID] AS [member_MemberID], [member].[FName], [member].[SName], 
[membertype].[MemberTypeID] AS [membertype_MemberTypeID], [membertype].[MemberTypeName], 
[membermembertype].[MemberID] AS [membermembertype_MemberID], [membermembertype].[MemberTypeID] 

SELECT [member].[MemberID] AS [member_MemberID], [member].[FName], [member].[SName], 
[membermembertype].[MemberID] AS [membermembertype_MemberID], 
[membermembertype].[MemberTypeID] AS [membermembertype_MemberTypeID], 
[membertype].[MemberTypeID] AS [membertype_MemberTypeID]

我试图过滤的组合框的 VBA 是:

Dim myMember As String
    
    myMember = "SELECT ... FROM ... WHERE ([MemberTypeID] = " & Me.cboMemberType & ");"
    Me.frmFilterTestSub.Form.RecordSource = myMember
    Me.frmFilterTestSub.Form.Requery

我为组合框的 VBA 中的 SELECT 语句尝试了多种不同的语法,包括:

"Select * from membermembertype where ([MemberTypeID] = " & Me.cboMemberType & ")"

"SELECT member.MemberID AS member_memberID, member.FName, member.SName, 
        membertype.MemberTypeID AS membertype_MemberTypeID, membertype.MemberTypeName, 
        membermembertype.MemberID AS membermembertype_MemberID, 
        membermembertype.MemberTypeID AS membermembertype_MemberTypeID 
    FROM member 
    LEFT JOIN (membertype 
    RIGHT JOIN membermembertype ON membertype.[MemberTypeID] = membermembertype.[MemberTypeID])
        ON member.[MemberID] = membermembertype.[MemberID] 
    WHERE ([MemberTypeID] = " & Me.cboMemberType & ")"

"SELECT member.*, 
        (membermembertype.MemberID AS mmt_MemberID), 
        (membermembertype.MemberTypeID AS mmt_MemberTypeID), 
        membertype.MemberTypeName 
    FROM (member 
    LEFT JOIN membermembertype ON mmt_MemberID = (member.MemberID AS m_MemberID)) 
    RIGHT JOIN membertype ON mmt_MemberTypeID=(membertype.MemberTypeID AS mt_MemberTypeID) 
    WHERE ([MemberTypeID] = " & Me.cboMemberType & ");"

我很确定第一个示例返回了最接近的结果,列表返回了每个所选成员类型的正确记录数,但是字段中填充了 #Name?错误值,这就是为什么我试图用多种不同的方法来加入表格。其他 SELECT STATEMENTS 正在返回 SQL 语法错误。

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

既然你只想列出成员,我猜你对 membertype 表信息并不感兴趣,那么你可以简单地这样做:

"SELECT member.MemberID AS member_memberID, member.FName, member.SName
 FROM member 
 INNER JOIN membermembertype 
   ON (membermembertype.[MemberTypeID] = " & Me.cboMemberType & " AND member.[MemberID]=membermembertype.[MemberID]) "

【讨论】:

完美运行!谢谢【参考方案2】:

右外连接在 SQL 中是非常不受欢迎的,当您可以按正确顺序使用左外连接时。

在您的情况下,无论如何,内部连接更好。

如果您关心安全性,您应该使用参数而不是字符串连接,但由于您使用的是 Access,我猜任何有权访问该文件的人都可以做他们喜欢做的事。

请试试这个,如果您遇到错误,请告诉我。

SELECT [Member].MemberId
, [Member].FName
, [Member].SName
, [MemberType].MemberTypeId
, [MemberType].MemberTypeName

FROM ((MemberType
INNER JOIN MemberMemberType ON MemberMemberType.MemberTypeId = MemberType.MemberTypeId)
INNER JOIN Member ON Member.MemberId = MemberMemberType.MemberId)

WHERE MemberType.MemberTypeId = 123 --Put your parameter here once you've tested that it works for a specific value

【讨论】:

感谢您的建议。我最初在表上有内部联接,但在阅读了有关在 Access 中设置这种类型的表结构的教程后更改了它。该教程说要使用左联接,但 Access 只允许在 membermembertype - membertype 表上进行右联接。我确实关心安全性,这就是我最初没有开始在 Access 中构建数据库的原因。只是因为紧迫性,我才迅速将一些东西放在 Access 中。您的建议使用 set 参数,但给出了错误消息 3079 MemberTypeID could reference more than table

以上是关于3 表连接的 MS Access VB SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章