共有三个表:
关于学生的表格:
s41071030(sno, sname, ssex, sage, sdept)
关于类(class)的表格:
c41071030(cno, cname, cpno, Credit)
关于选择类(class)的表格:
sc41071030(sno, cno,grade)
现在,我想要选择 sdept='CS'
学生的详细信息,并且他或她在 'CS'
系选择了最多类(class)。
最佳答案
与任何适度复杂的 SQL 语句一样,最好进行“TDQD”——测试驱动查询设计。从问题的简单部分开始,然后将它们构建为更复杂的答案。
为了了解计算机科学系的每个学生正在学习多少门类(class),我们写道:
SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno;
我们现在需要找到 NumCourses 的最大值:
SELECT MAX(NumCourses) MaxCourses
FROM (SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
现在我们需要将该结果与子查询连接起来,因此是时候使用 CTE(公共(public)表表达式)了:
WITH N AS
(SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
SELECT N.Sno
FROM N
JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
ON M.MaxCourses = N.NumCourses;
我们需要获取学生详细信息,因此我们将其与学生表连接起来:
WITH N AS
(SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
SELECT S.*
FROM s41071030 S
JOIN N ON N.Sno = S.Sno
JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
ON M.MaxCourses = N.NumCourses;
经过轻微测试的 SQL:您已收到警告。要进行测试,请运行组件查询,确保每次都能获得合理的结果。在前一个查询正常工作之前,不要继续进行下一个查询。
请注意,类(class)表对于您正在解决的查询并不重要。
另请注意,如果发现有多个学生都选修了相同数量的类(class),并且该数字是所有学生选修的最大类(class)数,则这可能会返回几行。 (因此,如果有 3 名学生每人选修 7 门类(class),并且没有学生选修超过 7 门类(class),那么您将在结果集中看到 3 行。)
关于sql - 从Oracle的两个表中选择一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768651/