我正在为明天的数据库系统考试做准备,我正在研究一个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
发布于 2016-05-03 15:01:45
对于聚合函数,您应该使用
SELECT "Yes"
FROM dbsProfs
HAVING MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5发布于 2016-05-03 15:00:57
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发布于 2016-05-03 15:00:57
确实,不能在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这假设注册确实是课程被指示的年份(正如您也假设的那样)。如果您喜欢Server而不是SELECT大小写,可以使用iif语句(后者更适合the标准)。
https://stackoverflow.com/questions/37007560
复制相似问题