这是我的表:
Student(sid,sname,sex,age,year,qpa)
Dept(dname,numphds)
Prof (pname,dname)
Course (cno,cname,dname)
Major(dname,sid)
Section(dname,cno,sectno,pname)
Enroll(sid,grade,dname,cno,sectno)
我已经尝试了几个代码来提出解决问题的解决方案"打印同时参加计算机科学课程和数学课程的学生的姓名。"但是,我没有得到任何结果填充。
我的第一次尝试"没有填充结果/没有错误":
SELECT student.sid, student.sname
FROM student
INNER JOIN major ON major.sid = student.sid
AND major.dname LIKE '%Computer Sciences%' AND '%Mathematics%'
GROUP BY student.sname, major.dname
第二次尝试"没有填充结果/没有错误":
SELECT student.sid, student.sname, course.dname
FROM student, course
INNER JOIN major ON major.dname = course.dname
WHERE course.dname = '%Computer Sciences%'
AND course.dname = '%Mathematics%'
第三次尝试使用错误消息:"未知列' student.dname'在' where子句'":
SELECT student.sid, student.sname
FROM student
WHERE EXISTS (SELECT * FROM major WHERE major.dname=student.dname LIKE '%Computer Sciences%' AND '%Mathematics%')
有人可以指出我正确的方向......
答案 0 :(得分:1)
有几种方法可以做到这一点,尽管没有一种方法特别优雅。这是一种方法:
SELECT student.sid, student.sname
FROM student
INNER JOIN major ON major.sid = student.sid
WHERE major.dname = 'Computer Sciences'
AND student.sid IN (
SELECT student.sid
FROM student
INNER JOIN major ON major.sid = student.sid
WHERE major.dname = 'Mathematics'
)
这将获得所有数学学生的列表,然后比较该列表以查看哪些学生在计算机科学中。你最终得到了两者兼而有之的学生名单。
答案 1 :(得分:0)
我使用更多联接并推断出与您提供的关系。这将返回学生姓名和ID,其中学生来自每个部门的一个班级。 GROUP BY是必要的,只有在学生在其中一个部门学习多门课程时才能消除重复。
SELECT student.sid, student.sname
FROM student
JOIN enroll e1 ON e1.sid=student.sid
JOIN course c1 ON c1.cno=e1.cno
JOIN enroll e2 ON e2.sid=student.sid
JOIN course c2 on c2.cno = e2.cno
WHERE c1.dname LIKE '%Mathematics%'
AND c2.dname LIKE '%Computer Science%'
GROUP BY student.sid
答案 2 :(得分:0)
您可以使用两个单独的连接,第一个将测试CS专业,第二个将测试数学:
SELECT student.sid, student.sname
FROM student
INNER JOIN enroll AS enroll1
ON enroll1.sid = student.sid AND enroll1.dname = '%Computer Sciences%'
INNER JOIN enroll AS enroll2
ON enroll2.sid = student.sid AND enroll2.dname = '%Mathematics%'
GROUP BY student.sname, major.dname
答案 3 :(得分:0)
我会使用聚合和having
子句来完成此操作。我发现这比使用连接的方法更具概括性:
SELECT s.sid, s.sname
FROM student s INNER JOIN
major m
ON m.sid = s.sid
GROUP BY s.sname, s.sname
HAVING SUM(m.dname LIKE '%Computer Sciences%') > 0 AND
SUM(m.dname LIKE '%Mathematics%') > 0;
having
条款中的每个条件都会计算参加特定课程的学生人数。 > 0
表示至少有一个。如果要添加第三或第四组课程,可以通过在HAVING
子句中添加更多条件来轻松实现。