不支持 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
Impala:AnalysisException:LEFT OUTER JOIN 需要 ON 或 USING 子句
LEFT JOIN ON AND 和LEFT JOIN ON WHERE区别