2011-10-12 74 views
0

我想查詢我的數據庫以下列方式:易SQL查詢加(按組)

查找名稱,主要和誰或者是數學專業或在已登記的最年輕的學生年齡由屬於計算機科學的教授授課的課程。

的模式如下:

STUDENT(*snum: integer, sname: string, major: string, slevel: string, age: integer) 
CLASS(*name: string, meets_at: date, room: string, fid: integer) 
ENROLLED(*snum:integer, *cname: string) 
FACULTY(*fid: integer, fname: string, deptid: integer) 
DEPARTMENT (*deptid: integer,dname: string, Location:string) 

(The fields with '*' are primary keys.) 

我有以下查詢寫,以找到正確的學生,但我無法弄清楚如何打印的名稱和專業。

SELECT MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences'); 

我嘗試以下,並得到了錯誤:「不是一個單一羣組功能」

SELECT s.sname, 
     s.major, 
     MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences'); 

任何想法? SQLPlus新手,所以我仍然試圖學習如何構建查詢。先謝謝你!

回答

2

簡單的方法:只是讓你有工作進入一個子查詢中查詢:

SELECT * 
FROM 
student where age = 
(
SELECT MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences')) 

如果你想的東西更優雅,我會多放一點想進去。

請注意,如果您在該年齡段有多個學生,您可能會獲得多行。

+0

完美,謝謝!我會更多地閱讀子查詢,因爲看起來你不需要做太多的事情。謝謝! – Jon

1

您需要添加一個GROUP BY子句。

試試這個:

SELECT s.sname, 
     s.major, 
     MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences') 
GROUP BY s.sname,s.major; 

此外,還有一個可選的HAVING子句,允許你謂詞應用到分組信息。例如,如果您想得到相同的結果,但僅適用於25歲以上的人,則可以編寫: SELECT s.sname, s.major, MIN(s.age) FROM student's WHERE(s .major = '數學') OR IN s.snum(SELECT e.snum FROM類別c, 登記E, 教師樓 部門d WHERE e.cname = c.NAME AND c.fid = F .fid AND d.dname ='Computer Sciences') GROUP BY s.sname,s.major HAVING MIN(s.age)> = 25;

請注意,將MIN(s.age)放入WHERE子句將不起作用。 HAVING子句是將謂詞應用於分組信息的方式。

希望幫助,

馬克