简体   繁体   中英

MS Access VB SQL Syntax for 3 Table Join

I have been trying to create a form which contains information from 3 tables. On this form I would like to have a filter combo box so that the user may select a member type and it will filter the list to members with that member type.

Members in our database can have more than one type. For this reason I created a memberTable:

MemberID FName SName etc.

A membertype table:

MemberTypeID MemberTypeName

and a joining table membermembertype:

MemberID MemberTypeID

I have tried to set my form up with a number of different queries:

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]

The VBA for the combo box that I have been attempting to filter with is:

Dim myMember As String
    
    myMember = "SELECT ... FROM ... WHERE ([MemberTypeID] = " & Me.cboMemberType & ");"
    Me.frmFilterTestSub.Form.RecordSource = myMember
    Me.frmFilterTestSub.Form.Requery

I have tried numerous different syntaxes for the SELECT statement in the VBA for the combo box including:

"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 & ");"

I'm pretty sure the first example returned the closest result with the list returning the correct number of records for each member type selected, however the fields were filled with the #Name? error value which is why I was trying to do a number of different ways to join the tables. The other SELECT STATEMENTS are returning SQL Syntax errors.

Any advice would be greatly appreciated!

Right outer join is highly frowned on in SQL, when you can use a left outer join in the correct order instead.

In your case, inner joins are better anyway.

You should use a parameter rather than string concatenation if you care about security, but since you're using Access I guess anyone with access to the file can already do what they like.

Please try this one and let me know if you get an error.

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

Since you only want to list the members, I guess that you are not really interested with membertype table info, then you can simply do this :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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