应显示0计数的行

时间:2014-07-28 14:43:09

标签: sql oracle join

我正在处理一个问题,使用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

3 个答案:

答案 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注册的记录。