【问题标题】:MySQL: Complex question with schema givenMySQL:给定架构的复杂问题
【发布时间】: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
)

【问题讨论】:

    标签: mysql select join


    【解决方案1】:

    由于这是作业,这里有一个提示......

    如果教授教授所有先决条件,则 Pnum 不存在于课程先决条件的子选择中,左连接到教授在给定学期教授的实际课程,其中实际课程为 NULL(换句话说,其中所教授的课程没有任何先决条件)。

    【讨论】:

    • 好的,所以如果我理解正确,我将首先尝试制作子查询,它选择教授教授的课程及其先决条件,然后将讲师的课程加入到每个先决条件。我现在的问题是如何获得所有先决条件?
    • @Garrett,进展顺利;它可能是正确的,但可能不是 - 问题说“教授在某个学期教授一门课程(课程的一部分)时正好教授一门课程。” - 这表明,如果教授在一个学期中有一些先决条件,而在另一个学期中虽然有一些先决条件,那么这种情况就没有资格教授一门课程的所有先决条件。如果这样的解释有意义,您可能需要更进一步;其他 cmets - 在执行 NOT IN 时不同应该无关紧要(实际上会减慢速度)。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多