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 语法的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET - VB.NET - 更新 MS_Access 表
ASP.NET - MS-ACCESS - VB.NET - SQL 语句错误