找到每个课程的前提条件有oracle sql

时间:2018-03-29 06:23:10

标签: oracle-sqldeveloper

我无法解决这个问题。这就是我目前所拥有的:

`SELECT a.SECTION_ID AS "Section ID", a.COURSE_NUM AS "Course Number",      a.SEMESTER || ' ' || a.YEAR AS "Academic Year", b.PREREQ
FROM EB.SECTION a`

到目前为止非常简单。我现在需要找到具有一(1)个必修课程的课程。

这是我认为需要使用的两个表:

SECTION table PREREQ table

我知道我必须使用某种子查询,我首先尝试过:

`SELECT a.SECTION_ID AS "Section ID", a.COURSE_NUM AS "Course     Number",        a.SEMESTER || ' ' || a.YEAR AS "Academic Year", b.PREREQ
FROM EB.SECTION a
LEFT JOIN EB.PREREQ b
ON a.COURSE_NUM = b.COURSE_NUMBER
WHERE b.COURSE_NUMBER IN
(SELECT b.COURSE_NUMBER
FROM EB.PREREQ b
GROUP BY b.COURSE_NUMBER
HAVING COUNT(b.PREREQ) > '1'
)

` 但我认为查询只是计算特定课程在PREREQ表上出现多次的位置。也许计算每门课程的预先要求,然后加上这些数字?我此刻有点难过。

1 个答案:

答案 0 :(得分:0)

如果course_number在prereq表上出现多次,那么(根据定义)它有多个先决条件,不是吗?

SELECT course_number
FROM EB.Section
GROUP BY course_number
HAVING COUNT(prereq) > 1
;

您的HAVING子句中不需要1左右的单引号。 Oracle隐式地将字符串转换为数字。这不会改变您的查询结果,但您应该知道Oracle正在这样做。除此之外,您的查询完全没问题(除非有一些其他未知的业务逻辑关于问题中未说明的先决条件)。

使用比A和B更有意义的缩写/字母组合对表进行别名也是一种好习惯。当您遇到连接多个表和内联视图的情况时,最好使用有意义的别名。重新格式化以便更清楚地阅读(个人意见):

SELECT
     S.section_id               AS "Section ID",
     S.course_num               AS "Course Number",        
     S.semester|| ' ' || S.year AS "Academic Year",
     P.preqreq                  AS "Prerequisite Course Number"
FROM EB.Section S
LEFT JOIN EB.Prereq P
     ON S.course_num = P.course_number
WHERE S.course_num IN(
                      SELECT course_number
                      FROM EB.Prereq
                      GROUP BY course_number
                      HAVING COUNT(prereq) > 1
                      )
;

您应该尝试澄清的唯一业务逻辑是“多个先决条件”是指DIRECT先决条件,还是通过层次结构的所有先决条件。如果是后者,则需要解决更难的问题,需要查看分层查询(CONNECT BY子句)/递归子查询因子。