2012-04-23 16 views
2

私が取り組んでいるいくつかのSQLでは、joinステートメントに少し問題があります。私の問題で私を助けることができるスマートな人がいるかどうか疑問に思った!そのような名前や電子メールなどのユーザ情報を含む - tblMember、tblResultとtblPointMS AccessでのSQL JOINの問題

tblMember:

は、私は3つのテーブルを結合するためにしようとしています。 tblResult - 彼らがレースを完了したフィニッシュポジションとタイムの詳細である限り、彼らがサインアップしたメンバーとレースの詳細を含む tblPoint - 人がレースでどのポジションを終了したかに関するポイントのセットを含む例えば、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、Points_1、Position_5。

これは、レースタイプ1の場合、1stが来れば10点、2ndは6点を獲得するということです。このテーブルは、異なるレースタイプをサポートすることができ、各レースタイプは独自のポイントシステムを備えています。

メンバはtblResultに何度でも出現することができます。メンバーが参加するために「サインアップ」されると、tblResultに表示され、終了位置や個人時間が割り当てられません。

+1

私は少しのサンプルデータを投稿することをお勧めします。たとえば、メンバーが結果表に表示される頻度はどのくらいですか?ポイントテーブルに5行しかありませんか? – Fionnuala

+0

アクセスは 'LEFT OUTER JOIN'と' RIGHT OUTER JOIN'をサポートしますが、 'FULL OUTER JOIN'はサポートしません(ただし、 'LEFT OUTER JOIN'と' RIGHT OUTER JOIN'は 'FULL OUTER JOIN'と同じです) 。 – onedaywhen

+0

あなたの提案した情報を含めるためにオリジナルの投稿を編集しました。それが明確になる可能性はありますか? @onedaywhen。私はここに必要な完全な結合だと思いますか?私はオンラインで完全な外出を再現する方法に関する記事を見ました。 – LNB

答えて

-1

MSアクセスでは、常にJOINLEFT JOINが混在していました。クエリを2つのサブクエリに分割します。これは、とにかくパフォーマンスを調整しないMS Accessにとって最高の戦略です。

また、これが助けにならない場合は、MS AccessがSQLソースの理解に問題がある可能性があるため、グラフィカルインターフェイスでクエリを作成してみてください... MS :-)を覚えておいてください。 MSと同じように動作する:簡単なユーザーのように:

これらのことを試してください。つまり、「できるだけシンプルに」Accessで作業してください。私の経験で問題が見つかります。また、サブクエリstragegy(簡単な手順を使用してクエリを構築する)では、サブ結果をテストすることができます。同じ問題を抱えている他の誰のために

+6

「MS Accessは、JOINとLEFT JOINを混在させるのに常に問題がありました」 - これは私の経験ではありません。 –

+1

@MitchWheatは全く同意します。これは、少なくとも2つのサブクエリを作成せずに行うことができます – Taryn

+0

少なくともGUIで作成されたクエリで。 – TMS

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;