2012-04-23 61 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;