2011-10-20 63 views
1

這是一個我在Oracle實驗考試中無法回答的問題。尋找sql中的參與總數

鑑於模式:

(Courses: cid(int), deptid(int)...); 
(Students: sid(int), sname (string), deptid(int)...); 
(Participation: cid(int), sid(int), ...); 

學生可以參加他的部門以外的課程。

需要獲得由他的部門提供的所有課程的學生的姓名。

如何在sqlplus中做到這一點?

+0

幾乎與此問題相同:http://stackoverflow.com/questions/7803775/sql-queries-involving-for-all/7803860#7803860 –

回答

2
SELECT s.sid, s.sname, s.deptid 
    FROM Students s 
     INNER JOIN Participation p 
      ON s.sid = p.sid 
     INNER JOIN Courses c 
      ON p.cid = c.cid 
       AND s.deptid = c.deptid 
    GROUP BY s.sid, s.sname, s.deptid 
    HAVING COUNT(DISTINCT c.cid) = (SELECT COUNT(*) 
             FROM Courses c2 
             WHERE c2.deptid = s.deptid) 
+0

1輕微的錯誤,OP允許學生在他們的課外部門,所以加入課程不應該限制s.deptid = c.deptid - 例如學生可以參加由不同部門提供給他們自己的每門課程 – Andrew

+0

@Andrew但是我們試圖讓那些參加他們部門提供的所有課程的學生,因此限制得到正確的計數。 –

+0

它說'他的部門' - 學生可能來自其他部門,但仍然參加'他'部門的每門課程 - 問題沒有具體說明只考慮部門學生在自己的部門中學習所有課程 - 它只是要求對於從該部門接受所有課程的所有學生。我會在學生證上進行分組,名字可以很容易複製 – Andrew

0

我不能tesst查詢現在,所以我不知道如果我有一個語法錯誤,反正你可以試試這個想法實現您的要求。

SELECT studentName 
FROM 
    (SELECT stu.sname  AS studentName, 
    cour.deptid   AS dept, 
    COUNT(*)    AS assistedCoursesByDpt, 
    Max(cour.total)   AS total 
    FROM students stu, 
    participation part, 
    (SELECT cour.deptid,COUNT(*) AS total FROM courses cour GROUP BY cour.deptid 
    ) AS cour 
    WHERE stu.sid=part.sid 
    AND part.cid =cour.cid 
    GROUP BY stu.sid, 
    cour.deptid 
) 
WHERE total=assistedCoursesByDpt 

這個想法是創建一個子查詢(cour),它有一個新的計算列,即總債務課程。然後你可以將這個總數與部門分組的學生課程進行比較。