2016-08-06 12 views
2

動機付け:私は従業員のトレーニング状況を追跡するためのアクセスデータベースを設計しています。各従業員は、その役割に基づいて訓練要件があります(たとえば、管理職の訓練や電話のエチケットを取る必要がありますが、電気技師は危険な安全を取らなければなりません)。私は、すべての人に必要なすべてのトレーニングと、完了したトレーニングコースの完了日を示すレポートを生成できるようにしたいと考えています。LEFT JOINクエリの出力が期待されない

スキーマ私は、次の表があります。

  • 人事 - リストの従業員情報、例えばを名前、電話、Eメール;キー:PersonnelID
  • コース - 利用可能なすべてのコースをリストし、説明を与えます。キー:CourseID
  • ロール - 会社内のすべての職務をリストします(電気技師、管理者アシスタントなど)。キー:RoleID
  • LnkPersonnelCourses - レコードがPersonnelIDCompletionDateCourseIDを完了したことを示して
  • LnkPersonnelRole - 記録RoleIDCourseIDが必要であることを示し、 - レコードがPersonnelIDEffectiveDate
  • LnkRolesCoursesを効力発生日とRoleIDからに割り当てられているか、削除されたことを示しています

私はに一致するように、クエリqryPersonnelCourseRequirementsを作成

SELECT qryLastLnkPersonnelRoleAddOnly.PersonnelID, LnkRolesCourses.CourseID 
FROM qryLastLnkPersonnelRoleAddOnly INNER JOIN LnkRolesCourses 
    ON qryLastLnkPersonnelRoleAddOnly.RoleID = LnkRolesCourses.RoleID; 

これが正常に動作し、各個人の現在のトレーニング要件私に告げる:

ここTrainingRequirements

がどの番組LnkPersonnelCoursesテーブルのスナップショットである彼らの現在のRoleIDのために必要なコースにどの人が完了したか、どの時点で(データは名目上のものであるか)を示します。

LnkPersonnelCourses Table

問題: 私は上記のクエリでのトレーニング要件に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); 

LEFT JOIN with pcr

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); 

LEFT JOIN with lpc

望ましい行動:

私はQを希望あなたのクエリはあなたがLnkPersonnelCoursesテーブルのIDqryPersonnelCourseRequirementsテーブルのPersonnelIDを比較してましたが、あなたが取得するLnkPersonnelCoursesテーブルのPersonnelIDと比較すると仮定して、両方で

enter image description here

答えて

3

問題:次のような結果を生成するueryで希望出力。

は、この文字列で検索してください:

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.PersonnelID); 

これは、所望の結果を得る必要があります。

+0

完璧な診断 - 元の回答を編集して、 'PersonnelID'と' CourseID'が 'pcr'クエリから来るようにしました。今これは意図どおり正確に動作します。ありがとうございました! –

+0

編集ありがとう – jonju

関連する問題