[英]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.