繁体   English   中英

SQL查询输出“是”

[英]SQL Query outputting “yes”

我明天要为数据库系统考试学习,并且正在研究SQL问题。 这个问题是论文中唯一没有答案的问题,但这是问题:


我们使用以下架构:

  • 教授 (姓名,职务,部门,年龄)(年龄是关键)
  • 课程 (cno,标题,部门)(cno代表课程号,是键,标题是课程的名称,dept是提供课程的部门的名称)
  • 入学 (cno,学期,inst_name,入学)(此操作的关键是(cno,学期)

问题:编写以下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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM