MS Access中的SQL JOIN问题

时间:2012-04-23 14:10:47

标签: sql ms-access join

在我正在处理的某些SQL中遇到连接语句有点麻烦。想知道是否有聪明的人能够帮助我解决我的问题!

我正在尝试加入3个表:tblMember,tblResult和tblPoint

tblMember - 包含姓名和电子邮件等用户信息。 tblResult - 包含他们已注册的成员和比赛的详细信息,只要他们完成比赛的结束位置和时间的详细信息。 tblPoint - 包含一组与一个人在比赛中完成的位置相关的点数,例如,第一名获得10分,第二名获得8分......如果一个人完成第六名或以下,则没有分数。

我希望查询返回tblResult.ResultID,tblMember.MemberName,tblResult.PersonalTime,tblResult.FinishPosition,tblPoint.Points。但是我希望它返回所有这些字段,即使FinishPosition为空并且没有分配点。

我几乎通过使用下面的SQL解决了这个问题:

SELECT DISTINCT tblResult.ResultID, tblMember.MemberName, tblResult.PersonalTime, 
tblResult.FinishPosition, tblPoint.Points
FROM (tblMember INNER JOIN tblResult ON tblMember.MemberID = tblResult.MemberID) LEFT   
JOIN tblPoint ON tblResult.FinishPosition = tblPoint.Position;

然而,这并不是很有效。当我的查询返回结果时,已经被分配了位置的人,比如说第二名,多次返回,第一次分配第一名的分数,然后第二次分配第二名的分数!

这必须是一个加入问题...但我看不出如何纠正它! 我已经尝试过使用IIF和ISNULL,但我认为这不是正确的选择。

我正在使用MS Access,它似乎不支持LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL JOIN。

有人可以帮忙吗?感谢您阅读本文。 :)

编辑: [tblPoint]包含字段(PointID,RaceTypeID,Points,Position)。每种种族类型有5行。 PointID是主键,表格可能如下所示:

Point ID - 1,RaceTypeID - 1,Points - 10,Position - 1

Point ID - 2,RaceTypeID - 1,Points - 6,Position - 2

Point ID - 3,RaceTypeID - 1,Points - 3,Position - 3

Point ID - 4,RaceTypeID - 1,Points - 2,Position - 4

Point ID - 5,RaceTypeID - 1,Points - 1,Position - 5.

这意味着对于第1类比赛,无论谁来1号获得10分,第2名获得6分,依此类推。该表可以支持不同的种族类型,每种种族类型都有自己的点系统。

会员可以在tblResult中出现任意次数,一旦会员'已注册'参与,他们就会出现在tblResult中,但没有分配完成位置或个人时间。

2 个答案:

答案 0 :(得分:1)

对于遇到同样问题的其他人:

我错过了另一个加入tblRaceType的连接,因为REMOU指出了,谢谢你! 这是我的最终SQL代码。

SELECT tblResult.ResultID, tblMember.MemberName, tblResult.PersonalTime, 
tblResult.FinishPosition, tblPoint.Points
FROM tblRaceType RIGHT JOIN ((tblMember INNER JOIN tblResult ON tblMember.MemberID = 
tblResult.MemberID) LEFT JOIN tblPoint ON tblResult.FinishPosition = tblPoint.Position) ON 
tblRaceType.RaceTypeID = tblPoint.RaceTypeID;

答案 1 :(得分:-1)

MS Access始终存在混合JOINLEFT JOIN的问题。将查询拆分为两个子查询。这是MS Access的最佳策略,无论如何都不会调整性能。

而且,如果这没有帮助,尝试在图形界面中创建查询,因为MS Access可能在理解SQL源时遇到问题...记住,它是MS :-)只需单击即可。像MS期望的那样 - 就像一个简单的用户: - )

尝试这些东西 - 即使用Access“尽可能简单”,根据我的经验,你会发现问题。还有子查询stragegy(使用简单步骤构建查询),您可以测试子结果。