2012-04-23 62 views
2

在我正在处理的某些SQL中,对于连接语句有点麻烦。想知道是否有聪明的人在那里能够帮助我解决问题!MS Access中的SQL JOIN问题

我想加入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; 

然而,这完全不是那么回事。当我的查询返回结果时,已经被分配了一个位置的人说第二个位置,将多次返回,第一次分配第一个位置的点数,然后第二个分配第二个位置的点数!

这已经成为一个JOIN问题......但我看不出如何纠正它! 我已经尝试使用IIF和ISNULL,但我不认为这是正确的使用。

我使用的MS Access似乎不支持左外连接,右外连接或全连接。

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

编辑: [tblPoint]包含字段(PointID,RaceTypeID,点,位置)。每种比赛类型有5行。点名是主键和表可能看起来像:

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

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

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

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

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

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

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

+1

我认为最好的办法是发布一些样本数据。例如,成员在结果表中出现的频率如何?点表中只有5行? – Fionnuala 2012-04-23 15:03:33

+0

访问支持'LEFT OUTER JOIN'和'RIGHT OUTER JOIN',但不是'FULL OUTER JOIN'(但请注意,'LEFT OUTER JOIN'和'RIGHT OUTER JOIN'的联合与'FULL OUTER JOIN'相同) 。 – onedaywhen 2012-04-23 15:15:47

+0

刚刚编辑我原来的帖子,包括你建议的信息,有没有让它更清晰的机会? @onedaywhen。你认为这是我需要的全外汇吗?我在网上看到了关于如何重新创建一个完整的外部连接的文章。 – LNB 2012-04-23 15:31:47

回答

-1

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

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

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

+6

“MS Access一直存在混合JOIN和LEFT JOIN的问题” - 这并不是我的经验。 – 2012-04-23 14:18:51

+1

@MitchWheat完全同意,这可以在不创建两个子查询的情况下完成 – Taryn 2012-04-23 14:19:52

+0

至少在GUI中创建的查询中。 – TMS 2012-04-23 14:28:58

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;