2016-08-06 22 views
2

Motivation: Ich entwerfe eine Zugangsdatenbank, um den Ausbildungsstatus meines Angestellten zu verfolgen. Jeder Mitarbeiter hat aufgrund seiner Rolle eine Schulungsvoraussetzung (z. B. müssen Verwaltungsassistenten ein Records-Management-Training und eine Telefon-Etikette absolvieren, während Elektriker eine gefährliche Sicherheit einnehmen müssen). Ich möchte in der Lage sein, einen Bericht zu erstellen, der für jede Person alle erforderlichen Schulungen und für die absolvierten Schulungen das Datum des Abschlusses angibt.LINKE VERBINDUNG Abfrage, die keine erwartete Ausgabe liefert

Schema ich die folgenden Tabellen:

  • Personal - Listen Mitarbeiter Informationen, zum Beispiel Name, Telefon, E-Mail; Schlüssel: PersonnelID
  • Kurse - listet alle verfügbaren Kurse auf und gibt eine Beschreibung; Schlüssel: CourseID
  • Rollen - listet alle Arbeitsrollen in der Firma auf (z. B. Elektriker, Verwaltungsassistent); Schlüssel: Aufzeichnungen zeigen, dass RoleID erfordert CourseID-RoleID
  • LnkPersonnelCourses - Aufzeichnungen zeigen, dass PersonnelIDCourseID auf CompletionDate abgeschlossen
  • LnkPersonnelRole - entfernt zugewiesen wurde EffectiveDate
  • LnkRolesCourses Aufzeichnungen zeigen, dass PersonnelID zu oder von RoleID mit Datum des Inkrafttreten

ich habe eine Abfrage qryPersonnelCourseRequirementsentsprechenauf die erforderlichen Kurse für ihre aktuellen RoleID:

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

Das funktioniert richtig und sagt mir jeder aktuellen Trainingsanforderungen der einzelnen:

TrainingRequirements

Hier ist eine Momentaufnahme der LnkPersonnelCourses Tabelle zeigt, welche Welchen der Kurse hat jede Person absolviert und wann (Daten sind fiktiv).

LnkPersonnelCourses Table

Problem: Wenn ich versuche, das in LnkPersonnelCourses zu den Ausbildungsanforderungen in der obigen Abfrage aufgezeichnet Trainingsaufzeichnungen des Individuums anzupassen, es zeigt nur, dass die Person einen einzigen Kurs abgeschlossen, wenn in der Tat, Die Person hat bereits mehrere Kurse absolviert, die ihren Trainingsbedarf erfüllen. Ich habe die Abfrage auf verschiedene Arten versucht.Hier ist so nah wie ich bekommen haben:

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

und

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

Wunschverhalten:

Ich möchte die q uery das folgende Ergebnis zu produzieren:

enter image description here

Antwort

3

Das Problem mit beiden Abfrage wurde Sie wurden mit ID von LnkPersonnelCourses Tabelle PersonnelID von qryPersonnelCourseRequirements Tabelle zu vergleichen, aber sie waren nehme an, es mit PersonnelID von LnkPersonnelCourses Tabelle zum Vergleich die bekommen Wunschausgabe.

Diese Abfrage:

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

Dies sollte das gewünschte Ergebnis.

+0

Perfekte Diagnose - Ich habe Ihre ursprüngliche Antwort so bearbeitet, dass 'PersonalID' und' CourseID' von der 'PKR' Abfrage kommen mussten. Jetzt funktioniert das genau so wie beabsichtigt. Vielen Dank! –

+0

Danke auch für den Schnitt – jonju