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 语法的主要内容,如果未能解决你的问题,请参考以下文章

SQL (MS ACCESS) 基于最大值连接表

MS Access 2007 中的 SQL 内部连接

ASP.NET - VB.NET - 更新 MS_Access 表

ASP.NET - MS-ACCESS - VB.NET - SQL 语句错误

MS Access SQL:使用另一个表中的Sum更新连接查询

左连接 SQL 查询 - MS Access