找到SQL表属性的最小值并创建一个新的属性表?

时间:2014-04-15 19:03:20

标签: sql oracle

我有三个SQL表。第一个是SCUBA_CLASSES,其属性为CLASSID和CLASSNAME。第二个是名为STUDENTS的表,其属性为STUDENTID和AGE。第三个是具有属性STUDENTID和COURSEID的表TAKES_CLASS。

如何创建一个新表格,显示该组中最年轻学生的CLASSID和CLASSNAME?

我有:

CREATE TABLE YOUNGEST_STUDENT_ENROLLMENT
SELECT SCUBA_CLASSES.CLASSID AS CLASSID, SCUBA_CLASSES.CLASSNAME AS CLASSNAME
FROM SCUBA_CLASSES, STUDENTS, TAKES_CLASS
WHERE MIN(STUDENTS.AGE)

不知道该怎么做。我必须找到最年轻的学生并输出他们注册的所有课程的CLASSID和CLASSNAME。

2 个答案:

答案 0 :(得分:2)

看起来VIEW比桌子更合适。新学生注册时,视图会自动更新;

CREATE VIEW YOUNGEST_STUDENT_ENROLLMENT AS
WITH cte AS (
  SELECT SC.CLASSID, SC.CLASSNAME, S.NAME, S.AGE, 
         ROW_NUMBER() OVER (PARTITION BY SC.CLASSID ORDER BY AGE) RN
  FROM SCUBA_CLASSES SC
  JOIN TAKES_CLASS TC ON SC.CLASSID = TC.CLASSID
  JOIN STUDENTS S ON S.STUDENTID = TC.STUDENTID
)
SELECT CLASSID,CLASSNAME,NAME,AGE FROM cte WHERE RN=1;

此视图将始终包含每个班级年龄最低的人。如果您希望它只包含最低年龄的人,无论哪个班级,您都可以删除PARTITION BY SC.CLASSID条款。

An SQLfidde to test with

答案 1 :(得分:0)

尝试这个嵌套查询: -

CREATE TABLE YOUNGEST_STUDENT_ENROLLMENT AS (
SELECT SCUBA_CLASSES.CLASSID AS CLASSID, SCUBA_CLASSES.CLASSNAME AS CLASSNAME
FROM SCUBA_CLASSES
WHERE SCUBA_CLASSES.CLASSID IN (SELECT  TAKES_CLASS.CLASSID FROM TAKES_CLASS
WHERE TAKES_CLASS.STUDENTID IN (SELECT  STUDENTS.STUDENTID FROM STUDENTS
WHERE STUDENTS.AGE IN (SELECT MIN(STUDENTS.AGE) as AGE FROM STUDENTS))));