2

私が取り組んでいるいくつかの SQL の結合ステートメントに少し問題があります。私の問題を解決してくれる賢い人がいるのだろうかと思いました!

tblMember、tblResult、および tblPoint の 3 つのテーブルを結合しようとしています。

tblMember - 名前や電子メールなどのユーザー情報が含まれています。tblResult - メンバーの詳細と、メンバーがサインアップしたレースの詳細を含みます。ただし、フィニッシュ ポジションとレースを完了した時間の詳細も含まれます。 1位は10点、2位は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;

しかし、これはうまくいきません。私のクエリが結果を返すと、すでにポジションが割り当てられている人 (たとえば 2 位) が複数回返され、1 位のポイントが最初に割り当てられ、次に 2 位のポイントが 2 回目に割り当てられます!

これは JOIN の問題に違いありません...しかし、それを修正する方法がわかりません! 私はすでに IIF と ISNULL を使用してみましたが、使用するのが正しいとは思いません。

LEFT OUTER JOIN、RIGHT OUTER JOIN、または FULL JOIN をサポートしていないように見える MS Access を使用しています。

誰でも助けることができますか?これを読んでくれてありがとう。:)

編集: [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 の混合に問題がありました。クエリを 2 つのサブクエリに分割します。これは、とにかくパフォーマンスを微調整しない MS Access にとって最良の戦略です。

また、これが役に立たない場合は、MS Access では SQL ソースの理解に問題がある可能性があるため、グラフィカル インターフェイスでクエリを作成してみてください... MS であることを思い出してください :-) クリックするだけです。MSが期待するように振る舞う - 簡単なユーザーのように:-)

これらのことを試してみてください - つまり、Access を「できるだけ簡単に」操作してください。私の経験では、問題を見つけることができます。また、サブクエリ戦略 (簡単な手順を使用してクエリを作成する) を使用すると、サブ結果をテストできます。

于 2012-04-23T14:18:13.210 に答える