2

我正在处理的一些 SQL 中的连接语句有点麻烦。想知道是否有任何聪明的人可以帮助我解决我的问题!

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

tblMember - 包含用户信息,例如姓名和电子邮件。tblResult - 包含成员和他们报名参加的比赛的详细信息,只要他们完成比赛的完成位置和时间的详细信息。 tblPoint - 包含与一个人在比赛中完成的位置相关的一组积分,例如第一名得 10 分,第二名得 8 分……如果一个人完成第 6 名或以下,则不得分。

我希望查询返回 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;

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

这一定是一个 JOIN 问题......但我不知道如何纠正它!我已经尝试过使用 IIF 和 ISNULL,但我认为这不是正确的使用方法。

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

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

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

点 ID - 1,RaceTypeID - 1,点 - 10,位置 - 1

点 ID - 2,RaceTypeID - 1,点 - 6,位置 - 2

点 ID - 3,RaceTypeID - 1,点 - 3,位置 - 3

点 ID - 4,RaceTypeID - 1,点 - 2,位置 - 4

点 ID - 5,RaceTypeID - 1,点 - 1,位置 - 5。

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

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

4

2 回答 2

1

对于其他有同样问题的人:

正如 REMOU 指出的那样,我错过了 tblRaceType 的另一个连接,谢谢!这是我最后的 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;
于 2012-04-23T22:30:03.540 回答
-1

MS Access 在混合JOINs 和LEFT JOINs 时总是遇到问题。将查询拆分为两个子查询。这是 MS Access 的最佳策略,无论如何您都不会调整性能。

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

尝试这些方法 - 即“尽可能简单”地使用 Access,根据我的经验,您会发现问题所在。此外,通过子查询策略(使用简单步骤构建查询),您可以测试子结果。

于 2012-04-23T14:18:13.210 回答