我无法解决这个问题。这就是我目前所拥有的:
`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)个必修课程的课程。
这是我认为需要使用的两个表:
我知道我必须使用某种子查询,我首先尝试过:
`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表上出现多次的位置。也许计算每门课程的预先要求,然后加上这些数字?我此刻有点难过。
答案 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子句)/递归子查询因子。