找到完全参与sql

时间:2011-10-20 02:27:21

标签: sql oracle sqlplus

这是我在oracle实验室考试中无法回答的问题。

鉴于架构:

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

学生可以参加他所在部门以外的课程。

需要获取其部门提供所有课程的学生的姓名。

如何在sqlplus中执行此操作?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我现在无法检查查询,因此我不知道是否有语法错误,无论如何,您可以尝试这个想法来达到您的要求。

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),它有一个新的计算列,总债务的课程。然后你可以将这个总数与部门的agrouped学生课程进行比较。