sql - 从Oracle的两个表中选择一条记录

标签 sql oracle11g greatest-n-per-group

共有三个表:

  1. 关于学生的表格:s41071030(sno, sname, ssex, sage, sdept)

  2. 关于类(class)的表格:c41071030(cno, cname, cpno, Credit)

  3. 关于选择类(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/

相关文章:

c++ - 使用 C++ 检索 SQL 表行数

MYSQL 查询与选择具有 LIMIT 条件不同

sql - 获得每个组的最高结果(在 Oracle 中)

SQL Server 在 where 条件下替代 OR

php - 如何选择字段的默认值

mysql - 我可以使用驼峰式别名来命名 SQL 的结果列吗?

c# - Oracledependency 事件未触发

sql - Oracle - 如何使用 FAST REFRESH 和 JOINS 创建物化 View

sql - 返回具有相同 ref_id 的每个元素的最后金额

mysql - 不返回重复的 mysql 行