簡體   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