【发布时间】:2010-10-29 02:29:24
【问题描述】:
这是架构:
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) 谁曾在 班级关系,无论是课程 没有任何先决条件或 教授还教过每一个 课程的先决条件。一个 教授教授一门课程的确切时间 教授教了一门课(a 课程的一部分)在某个术语中。
到目前为止我的起点......
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
)
【问题讨论】: