2016-09-11 67 views
0

私は様々な投稿(this onethat onethis other one)を調べて答えがあると思いました。Left Join On And節はサポートされていません

LEFT JOINの後にON [condition] AND [other condition]を追加することもできます(WHEREも試しました)。しかし、コンピュータはと言います。アクセスは、の結合式がサポートされていないと言っています。

student_recordsテーブルの下に考えてみましょう:

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

私は私のstudentsテーブルから各学生のための最低限のSEMESTERINDEXを見つけたい、それが20001 以下(レコード間違っていてもよく、0と1 SEMESTERINDEXされる上です)

私はアクセス権を使用しているので、SQL内部にはVBA関数があります。私が参加しているテーブルがいくつかあります。クエリ全体を引用しています。

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; 

私はAND student_records.SEMESTERINDEX > 2001を置き忘れましたか?

答えて

0

ああ私はこれらの括弧と狂ったインデントから私を救ってくれます。

これはあなたのやり方です。すべてのかっこは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 

には関係ありません。これは、それはあなたが設定されたサブであなたのグループ化を実行し、データの残りの部分にそれをバックに参加することができますSQLのサブクエリと呼ばれています。

フィルタが必要な結合について何かがあったと誤解していたと思います。実際には、フィルタリングする必要があったデータです。

+1

「SQLではすべてのかっこは問題ではありません」というのは、Accessで行うことです。結合されたテーブルをカッコで囲む必要性については、アクセスは面倒です。 –

+0

@DStanley - nope。アクセスはそれらにクエリを表示しますが、それらを取り出してJetエンジンに送信すると、正常に機能します。結局、SQLシステムです。それは、すべてのそのようなものを入れているクエリビルダエンジンです。 – Hogan

+0

私は基本的にstudent_recordの学生コードごとに最小値と最大値を計算し、結果をminmaxテーブルにラップし、そのテーブルをstudent_recordに結合します。右? – Benjamin

関連する問題