2016-09-11 3 views
0

Ich habe in verschiedenen Beiträge (this one, that one und this other one) untersucht und dachte, ich habe die Antwort bekommen.Links Join On And Klausel nicht unterstützt

Nach einer LEFT JOIN kann ich eine ON [condition] AND [other condition] hinzufügen (ich habe auch versucht WHERE). Aber Computer sagt nein. Access sagt weiter, dass der Join-Ausdruck nicht unterstützt wird.

Betrachten Sie die student_records Tabelle unten:

STUDENTCODE | SEMESTERINDEX 
12345  | 20112 
12345  | 20113 
12345  | 20121 
67890  | 0 
67890  | 20111 
67890  | 20112 

ich das Minimum SEMESTERINDEX für jeden Schüler aus meiner students Tabelle finden will, das ist oben 20001. (Aufzeichnungen unter fehlerhaft sein können und die 0 und 1 SEMESTERINDEX ist verwendet für übertragene Kredite.)

Ich benutze Zugang, also gibt es VBA-Funktionen innerhalb der SQL. Es gibt noch mehrere Tabellen, denen ich mich anschließe. Ich zitiere die ganze Frage.

SELECT students.STUDENTCODE, prefixes.PREFIXNAMEENG, 
students.STUDENTNAMEENG, students.STUDENTSURNAMEENG, levels.level_name, programs.PROGRAMNAMEENG, calendars.calendar_load, 
MAX(student_records.SEMESTERINDEX) AS latest_semester, MIN(student_records.SEMESTERINDEX) AS intake_semester, 
FROM student_records LEFT JOIN (
    (
     (
      (
       (students LEFT JOIN prefixes ON students.PREFIXID = prefixes.PREFIXID) 
       LEFT JOIN levels ON students.LEVELID = levels.level_id) 
      LEFT JOIN programs ON students.PROGRAMID = programs.PROGRAMID) 
     LEFT JOIN calendar_conversion ON students.SCHEDULEGROUPID = calendar_conversion.schedule_id) 
    LEFT JOIN calendars ON calendar_conversion.calendar_id = calendars.calendar_id) ON student_records.STUDENTCODE = students.STUDENTCODE AND student_records.SEMESTERINDEX> 2001 
GROUP BY students.STUDENTCODE, prefixes.PREFIXNAMEENG, students.STUDENTNAMEENG, students.STUDENTSURNAMEENG, levels.level_name, programs.PROGRAMNAMEENG, calendars.calendar_load; 

So habe ich das falsch anbringen AND student_records.SEMESTERINDEX > 2001?

Antwort

0

oh meine rette mich aus diesen Klammern und verrückt Einrücken.

Hier ist, wie Sie es tun. Alle Klammern sind nicht wichtig in SQL

SELECT 
    students.STUDENTCODE, 
    prefixes.PREFIXNAMEENG, 
    students.STUDENTNAMEENG, 
    students.STUDENTSURNAMEENG, 
    levels.level_name, 
    programs.PROGRAMNAMEENG, 
    calendars.calendar_load, 
    minmax.latest_semester, 
    minmax.intake_semester, 
FROM student_records 
LEFT JOIN (
    SELECT 
    studentcode, 
    MAX(student_records.SEMESTERINDEX) AS latest_semester, 
    MIN(student_records.SEMESTERINDEX) AS intake_semester 
    FROM students 
    WHERE students.STUDENTCODE > 2001 
    GROUP BY studentcode 
) as MinMax ON student_records.STUDENTCODE = minmax.STUDENTCODE 
LEFT JOIN students ON student_records.STUDENTCODE = students.STUDENTCODE 
LEFT JOIN prefixes ON students.PREFIXID = prefixes.PREFIXID 
LEFT JOIN levels ON students.LEVELID = levels.level_id 
LEFT JOIN programs ON students.PROGRAMID = programs.PROGRAMID 
LEFT JOIN calendar_conversion ON students.SCHEDULEGROUPID = calendar_conversion.schedule_id 
LEFT JOIN calendars ON calendar_conversion.calendar_id = calendars.calendar_id 

Dies ist eine Unterabfrage in SQL aufgerufen wird es Sie Ihre Gruppierung ausführen können auf eine Untergruppe und dann kommen diese zurück an den Rest der Daten.

Ich glaube, Sie sind falsch gelaufen, weil Sie dachten, dass etwas an der Verknüpfung einen Filter benötigt - in der Tat sind es die Daten, an die Sie sich anschlossen, die gefiltert werden mussten.

+1

"Alle Klammern spielen in SQL keine Rolle", tun sie in Access. Der Zugriff ist ärgerlich, da die verbundenen Tabellen in Klammern gesetzt werden müssen. –

+0

@DStanley - nein. Access zeigt Ihnen Abfragen mit ihnen, aber wenn Sie sie herausnehmen und sie an die Jet Engine senden, wird es gut funktionieren - es ist schließlich ein SQL-System. Es ist die Query Builder-Engine, die all diesen Mist einbringt. – Hogan

+0

Ich sehe, so im Grunde berechnen Sie die min und max pro Studentcode in der student_record, wickeln Sie das Ergebnis in minmax-Tabelle, und verbinden Sie diese Tabelle zu student_record. Recht? – Benjamin