我正在处理一个问题,使用SQL Oracle。我在一行应该出现的计数为0的行旁边得到了正确的结果。问题是
问题:
对于项目管理课程的每个部分,列出部分ID,地点和注册学生人数。按部分ID排序。
我的代码:
SELECT s.Section_Id, s.Location, COUNT(*) AS Enrolled
FROM Course c, Section s, Enrollment e
WHERE c.Course_No = s.Course_No
AND s.Section_Id = e.Section_Id
AND c.Description = 'Project Management'
GROUP BY c.Course_No, s.Location, s.Section_Id
ORDER BY s.Section_Id;
我的结果:
SECTION_ID LOCATION ENROLLED
---------- ------------------- ----------
48 L211 4
119 L211 3
120 L214 2
预期结果:
SECTION_ID LOCATION ENROLLED
---------- ------------------- ----------
48 L211 4
119 L211 3
120 L214 2
121 L507 0
因此,您可以看到我错过了在我的搜索结果中注册0的行,并且似乎无法显示该行。此外,您会注意到它是该项目管理类的部分ID和位置,但它不会出现。我不确定我做错了什么。
任何帮助都会很棒,here is the Schema。
DBMS:我使用的是Oracle SQL Developer
答案 0 :(得分:2)
如何加入表而不是使用WHERE子句:
SELECT s.Section_Id,
s.Location,
COUNT(e.Section_Id) AS Enrolled
FROM course c
LEFT JOIN section s
ON c.Course_No = s.Course_No
LEFT JOIN enrollment e
ON s.Section_Id = e.Section_Id
WHERE c.Description = 'Project Management'
GROUP BY c.Course_No,
s.Location,
s.Section_Id
ORDER BY s.Section_Id;
答案 1 :(得分:0)
您需要外部加入课程和注册,否则您将看不到没有任何课程/注册的部分。您可以使用ANSI语法... LEFT JOIN ...等或使用(+)对缺陷表的列的旧Oracle语法: -
SELECT s.Section_Id, s.Location, COUNT(*) AS Enrolled
FROM Course c, Section s, Enrollment e
WHERE c.Course_No (+) = s.Course_No
AND s.Section_Id = e.Section_Id (+)
AND c.Description (+) = 'Project Management'
GROUP BY c.Course_No, s.Location, s.Section_Id
ORDER BY s.Section_Id;
这些天我会使用ANSI语法......
答案 2 :(得分:0)
@OmniSquad你可以使用Linger提供的SQL来创建LEFT OUTER JOIN,并选择没有注册和更改语句COUNT(e.Section_Id)AS注册的记录。