【问题标题】:Find the minimum value of a SQL table attribute and create a new table of attributes?找到 SQL 表属性的最小值并创建一个新的属性表?
【发布时间】:2014-04-15 19:03:19
【问题描述】:

我有三个 SQL 表。第一个是具有 CLASSID 和 CLASSNAME 属性的 SCUBA_CLASSES。第二个是名为 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。

【问题讨论】:

  • SCUBA_CLASSES 和 STUDENTS 表有关系吗?
  • 不,两者没有关系。它们之间的唯一关系是包含 STUDENTID 属性(与 STUDENTS 共享)和 CLASSID 属性(与 SCUBA_CLASSES 共享)的 TAKES_CLASS 表。

标签: sql oracle


【解决方案1】:

看起来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.

【讨论】:

  • 其实所有的表属性都是VARCHAR(15),除了AGE是NUMBER。当我将所有值更改为 VARCHAR 时,代码中断了。当只有 AGE 是整数时,有没有办法做到这一点?
  • 是的,这是我的更改:sqlfiddle.com/#!4/2a49b/1。我认为只有 1 级和 4 级应该出现。
  • @JIL 如果您只想要一个学生,请删除PARTITION BY,如sqlfiddle.com/#!4/08347/1 中的@
  • 不应该classID 1和classID 4都出现吗?该表应显示最小学生(12 岁)上的所有课程。所以,我认为这是第 1 类和第 4 类。
  • @JIL 啊,我明白你的意思了,那么你需要使用RANK() OVERsqlfiddle.com/#!4/0cc79/1
【解决方案2】:

试试这个嵌套查询:-

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))));

【讨论】:

  • 我收到一条错误消息:WHERE SCUBA_CLASSES.CLASSID = (SELECT TAKES_CLASS.CLASSID FROM TAKES ERROR at line 4: ORA-00921: unexpected end of SQL command
  • 我似乎无法在这里使用空格。 “TAKES”和“ERROR”之间应该有一个换行符。
  • 我注意到有 2 个右括号,但有 3 个左括号,所以我在 "STUDENTS.AGE)));" 末尾添加了一个括号然后在oracle中运行。它给出了一个奇怪的答案“SELECT * FROM YOUNGEST_STUDENT_ENROLLMENT ERROR at line 1: ORA-00942: table or view does not exist”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多