[英]SQL Query outputting “yes”
我明天要为数据库系统考试学习,并且正在研究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
通过聚合功能,您应该使用
SELECT "Yes"
FROM dbsProfs
HAVING MAX(dbsProfs.age) - MIN(dbsProfs.age) <= 5
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
的确,您不能在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,则可以使用iif
语句(后者更适合t-SQL标准)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.