微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

3表联接的MS Access VB SQL语法

如何解决3表联接的MS Access VB SQL语法

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

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

会员编号 姓名 名称

成员类型表:

MemberTypeID MemberTypeName

和连接表的membermembertype:

会员编号 MemberTypeID

我尝试通过许多不同的查询来设置表单:

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],[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语法错误

任何建议将不胜感激!

解决方法

当您可以按正确的顺序使用左外部联接时,在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
,

由于您只想列出成员,所以我想您对成员类型表信息并不真正感兴趣,那么您可以执行以下操作:

"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]) "

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。