動機付け:私は従業員のトレーニング状況を追跡するためのアクセスデータベースを設計しています。各従業員は、その役割に基づいて訓練要件があります(たとえば、管理職の訓練や電話のエチケットを取る必要がありますが、電気技師は危険な安全を取らなければなりません)。私は、すべての人に必要なすべてのトレーニングと、完了したトレーニングコースの完了日を示すレポートを生成できるようにしたいと考えています。LEFT JOINクエリの出力が期待されない
スキーマ私は、次の表があります。
- 人事 - リストの従業員情報、例えばを名前、電話、Eメール;キー:
PersonnelID
- コース - 利用可能なすべてのコースをリストし、説明を与えます。キー:
CourseID
- ロール - 会社内のすべての職務をリストします(電気技師、管理者アシスタントなど)。キー:
RoleID
- LnkPersonnelCourses - レコードが
PersonnelID
がCompletionDate
にCourseID
を完了したことを示して - LnkPersonnelRole - 記録
RoleID
はCourseID
が必要であることを示し、 - レコードがPersonnelID
がEffectiveDate
- LnkRolesCoursesを効力発生日と
RoleID
からに割り当てられているか、削除されたことを示しています
私はに一致するように、クエリqryPersonnelCourseRequirements
を作成
SELECT qryLastLnkPersonnelRoleAddOnly.PersonnelID, LnkRolesCourses.CourseID
FROM qryLastLnkPersonnelRoleAddOnly INNER JOIN LnkRolesCourses
ON qryLastLnkPersonnelRoleAddOnly.RoleID = LnkRolesCourses.RoleID;
これが正常に動作し、各個人の現在のトレーニング要件私に告げる:
がどの番組LnkPersonnelCourses
テーブルのスナップショットである彼らの現在のRoleID
のために必要なコースにどの人が完了したか、どの時点で(データは名目上のものであるか)を示します。
問題: 私は上記のクエリでのトレーニング要件にLnkPersonnelCourses
に記録されている個人のトレーニング記録を一致させるためにしようとすると、それだけで個人が単一のコースを完了したことを、実際に示し、その訓練要件を満たしている複数のコースを既に完了しています。私はいくつかの方法でクエリを試みました。ここで私が得ているほど近いです:
SELECT pcr.PersonnelID, pcr.CourseID, lpc.CompletionDate
FROM qryPersonnelCourseRequirements AS pcr LEFT JOIN LnkPersonnelCourses AS lpc
ON (pcr.CourseID = lpc.CourseID) AND (pcr.PersonnelID = lpc.ID);
と
SELECT lpc.PersonnelID, lpc.CourseID, lpc.CompletionDate
FROM qryPersonnelCourseRequirements AS pcr LEFT JOIN LnkPersonnelCourses AS lpc
ON (pcr.CourseID = lpc.CourseID) AND (pcr.PersonnelID = lpc.ID);
望ましい行動:
私はQを希望あなたのクエリはあなたがLnkPersonnelCourses
テーブルのID
でqryPersonnelCourseRequirements
テーブルのPersonnelID
を比較してましたが、あなたが取得するLnkPersonnelCourses
テーブルのPersonnelID
と比較すると仮定して、両方で
完璧な診断 - 元の回答を編集して、 'PersonnelID'と' CourseID'が 'pcr'クエリから来るようにしました。今これは意図どおり正確に動作します。ありがとうございました! –
編集ありがとう – jonju