繁体   English   中英

3 表连接的 MS Access VB SQL 语法

[英]MS Access VB SQL Syntax for 3 Table Join

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

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

MemberID FName SName 等

成员类型表:

MemberTypeID MemberTypeName

和一个连接表成员成员类型:

会员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 语法错误。

任何建议将不胜感激!

当您可以按正确顺序使用左外连接时,右外连接在 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]) "

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM