我明天正在学习数据库系统考试,而且我正在研究SQL问题。这个问题是论文中唯一没有答案的问题,但问题在于:
我们使用以下架构:
问题:编写以下sql查询:输出一个包含单行的表"是"如果2000年至2009年期间教授数据库系统课程的最老和最年轻的教授之间的年龄差异最多为5年
我不确定我的做法是否正确,因为我们并不想从表中输出任何内容。请注意,我认为注册对应于教师开始教授课程的时间(这不是通常的定义AFAIK)。
我的方法如下:
WITH dbsProfs AS (
SELECT P.age
FROM Professor P, Enroll E, Course C
WHERE P.name = E.inst_name AND C.cno = E.cno AND C.title = "Database Systems"
AND E.enrollment BETWEEN 2000 and 2009
)
SELECT "Yes"
FROM dbsProfs
WHERE MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5
我对我的临时桌很有信心。我正在对所有3个表进行连接,并过滤掉仅包含与我的查询相关的表。这是另一半我不确定的。
有关这是否正确/如何纠正这一点的任何见解将非常感激。我不相信WHERE MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5
是有效的SQL
答案 0 :(得分:2)
使用聚合功能,您应该使用
SELECT "Yes"
FROM dbsProfs
HAVING MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5
答案 1 :(得分:0)
WITH dbsProfs AS (
SELECT MIN(P.age) as min_age,MAX(P.age) as max_age
FROM Professor P, Enroll E, Course C
WHERE P.name = E.inst_name AND C.cno = E.cno AND C.title = "Database Systems"
AND E.enrollment BETWEEN 2000 and 2009
)
SELECT CASE WHEN min_age<max_age THEN "Yes" END
FROM dbsProfs
答案 2 :(得分:-1)
确实,您不能将聚合函数放在WHERE语句中。这个问题需要更多的工作。
这是我要采取的方法:
SELECT CASE WHEN A.MaxAge - A.MinAge <=5 THEN "Yes" END
FROM
(
SELECT Max(Professor.age) AS MaxAge, Min(Professor.age) AS MinAge
FROM Professor INNER JOIN Enroll ON Professor.name = Enroll.inst_name
INNER JOIN Course ON Enroll.cno = Course.cno
WHERE Course.title = "Database Systems" AND Enroll.enrollment BETWEEN 2000 AND 2009
) AS A
这假设注册确实是指导课程的那一年(正如您所假设的那样)。如果你喜欢SQL Server而不是SELECT CASE(后者更符合t-SQL标准),你可以使用iif
语句。