不支持 Left Join On And 子句

Posted

技术标签:

【中文标题】不支持 Left Join On And 子句【英文标题】:Left Join On And clause not supported 【发布时间】:2016-09-11 02:50:18 【问题描述】:

我查看了各种帖子(this one、that one 和 this other one)并认为我得到了答案。

LEFT JOIN 之后,我可以添加ON [condition] AND [other condition](我也尝试过WHERE)。但是电脑说。 Access 一直说 join 表达式不受支持

考虑下面的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

【问题讨论】:

【参考方案1】:

哦,我从这些括号和疯狂的缩进中拯救我。

这是你的做法。所有括号在 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 中称为子查询,它允许您对子集执行分组,然后将其连接回其余数据。

我认为您错误地认为连接中存在某些需要过滤器的内容 - 事实上,需要过滤的是您要连接的数据。

【讨论】:

“所有括号在 SQL 中都不重要”他们在 Access 中执行。 Access 在要求将连接表放在括号中时非常挑剔。 @DStanley -- 不。 Access 将向您显示带有它们的查询,但如果您将它们取出并将它们发送到 Jet Engine,它将正常工作——毕竟它是一个 SQL 系统。是查询生成器引擎把所有这些废话都放进去了。 我明白了,所以基本上你计算 student_record 中每个 studentcode 的最小值和最大值,将结果包装在 minmax 表中,然后将该表连接到 student_record。对吗? @DStanley - 您在 SQL 中唯一需要它们的情况是,如果您在同一个查询中组合 LEFT 和 RIGHT 连接,并且出于某些变态的原因想要将它们按非“自然”的顺序排列"。 @Benjamin - 如果将其称为“包装”让您感觉更好,那当然。如果您将其称为子查询,SQL 程序员会更好地理解您的意思。因此,我们将结果放在子查询中,并将其加入到主查询中。

以上是关于不支持 Left Join On And 子句的主要内容,如果未能解决你的问题,请参考以下文章

带有 ON 子句或替代方法的休眠 LEFT JOIN FETCH

如何在 LEFT JOIN ON 子句中使用子选择?

Impala:AnalysisException:LEFT OUTER JOIN 需要 ON 或 USING 子句

LEFT JOIN ON AND 和LEFT JOIN ON WHERE区别

left join on and 和left join on where 的区别

sql left join on and 与 where