我在查询2013年的数据时遇到了问题。我尝试在课程表中显示所有课程名称,并显示从用户提供的两个日期之间注册的课程表中每个课程注册的学生总数。问题是查询不显示课程表中的所有课程。它只显示学生注册的课程。这是我的SQL:
SELECT Course.Course_name, Count(new_enrolments.Student_code) AS Total,
Format([Start_date],"mmmm yyyy") AS [Month]
FROM Course LEFT JOIN new_enrolments ON Course.Course_name = new_enrolments.Course_name
GROUP BY Course.Course_name, Format([Start_date],"mmmm yyyy"), new_enrolments.Start_date
HAVING (((new_enrolments.Start_date) Between [Forms]![ParameterForm]![txtBeginDate] And [Forms]![ParameterForm]![txtEndDate]));
答案 0 :(得分:1)
OUTER JOIN (左连接或右连接)只要您在联接之外没有 WHERE CLAUSE ,就可以正常工作。 因为您的where子句将首先执行,所以有效地将您的外部联接转换为 INNER JOIN 。 因此,解决方案是将 WHERE CLAUSE 移动到您的JOIN中。 以下查询应该有效:
SELECT a.Course_name, COUNT(b.Student_code) AS [Total], Format(b.Start_date,"mmmm yyyy") AS [Month]
FROM Course a
LEFT JOIN
(
SELECT b.Course_name, b.Student_code, b.Start_date
FROM new_enrolments b
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate]
) b
ON a.Course_name=b.Course_name
GROUP BY a.Course_name, b.Start_date
;
替代方法是使用 UNION (见下文)。 第一个查询检索存在注册的所有课程名称。 第二个检索没有注册的所有课程名称。
SELECT a.Course_name, COUNT(b.Student_code) AS [Total], Format(b.Start_date,"mmmm yyyy") AS [Month]
FROM Course a INNER JOIN new_enrolments b ON a.Course_name=b.Course_name
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate]
GROUP BY a.Course_name, b.Start_date
UNION
SELECT a.Course_name, NULL, NULL
FROM Course a
WHERE a.Course_name NOT IN
(
SELECT b.Course_name
FROM new_enrolments b
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate]
)