【发布时间】:2023-03-21 12:33:01
【问题描述】:
我有以下数据库:
Prof(profBadge, profName, Department)
Course(courseCod, courseName, profBadge, area)
Class(classCode, date, courseCod, numberOfStudents)
还有以下请求: 对于在地区数据库中只有课程的每位教授,显示徽章编号和平均学生人数最多的课程。
Create view badgeList(profBadge, courseCod) as
SELECT DISTINCT profBadge, courseCod
FROM Coure
WHERE (profBadge NOT IN (SELECT profBadge
FROM Course
WHERE Area <> 'database'));
Create view avgLessons(AvgStud, courseCod) as
SELECT AVG(numberOfStudents), courseCod
FROM class
GROUP BY courseCod;
Create view MaxStudent(maxStu, profBadge) as
select max(med.avgStud), el.profBadge
from avgLessons med, badgeList el
where med.courseCod= el.courseCod
group by el.profBadge;
select DISTINCT MS.profBadge, MS.MAXSTU, Corso.CODCORSO
from MaxStudent MS, course, class
where MS.profBadge = course.profBadge and MS.maxStu = class.numberOfStudents and course.courseCod = class.courseCod;`
【问题讨论】:
-
把它分成几部分。首先,您如何找到平均学生人数最多的课程?那么如何将其加入数据集并显示“数据库”课程的徽章和课程编号?
-
但是如果我找到编号最大的课程,我会丢失其他课程的信息,还是不会?我需要为每位教授找到平均学生人数最多的课程
-
所以在 profbadge 上的计算中包含一个 group by。并使用徽章和课程重新加入。我试图避免的是为您写答案,而是指导您采取步骤尝试并让您找到解决方案/尝试自己。那位老人教一个人吃一辈子的鱼,给他们一天吃的鱼。不要吃掉整只大象,一次只吃一口,看看它是如何结合在一起的。把复杂的东西分解成组件变得简单,当你把组件放回去时,它就不再复杂了。
-
我在 xQbert 这边。一步一步地做到这一点。第一步:找到只在地区数据库中开设课程的教授。想办法。遇到问题再回来。
-
您的最后一个查询无效。您获得了每门课程的平均学生人数,例如12.5,并采取了每位教授的最大值。但这当然不一定与
class.numberOfStudents匹配。你必须加入反对avgLessons而不是class。
标签: sql oracle subquery oracle-sqldeveloper