这是模式:

Student(Snum, Sname)
Course(Cnum, Cname)
Prerequisite(Cnum, Prereq)
Professor(Pnum,Pname, Dept, Office)
Enrollment(Snum, Cnum, Term, Section, Mark)
Schedule(Cnum, Term, Section, Days, Time, Room)
Class(Cnum, Term, Section, Instructor)


完整的问题是:


  寻找教授(Pnum,Pname,Dept)
  谁每当在
  班级关系,或者课程
  没有任何先决条件或
  教授还教了每个
  课程的先决条件。一种
  教授确切地讲授课程的时间
  教授教了一堂课
  课程的一部分)。


到目前为止,我的起点...

SELECT * FROM Class c
LEFT JOIN Prerequisite p ON p.Cnum = c.Cnum
WHERE p.Cnum IS NULL


我知道如何找到教授的课程,但没有先决条件,因此可以满足部分条件。下一步是找到他们是否已经教过前提条件。另外,当一个类确实存在多个先决条件时,我当前的查询仅为每个类选择一个先决条件。

注意:Cnum和Prereq都是Cnum的外键

谢谢你的帮助!这是一个韧性。

编辑:
我想出了最终答案!

SELECT prof.Pnum, prof.Pname, prof.Dept FROM Professor prof
WHERE prof.Pnum NOT IN
(
SELECT DISTINCT c.Instructor FROM Class c
RIGHT JOIN Prerequisite p ON p.Cnum = c.Cnum
LEFT JOIN Class cpre ON cpre.Cnum = p.Prereq AND cpre.Instructor = c.Instructor
WHERE cpre.Instructor IS NULL AND c.Instructor IS NOT NULL
)

最佳答案

由于这是家庭作业,因此这里有个提示...

如果教授教授了所有先决条件,则Pnum在“课程的先决条件”的子选择中不存在,而该子菜单与教授在给定术语中教授的实际班级联系在一起,而实际班级为NULL(换句话说,在没有任何先决条件的前提下,没想到)。

10-06 10:09