【问题标题】:Too many values in a subquery子查询中的值太多
【发布时间】:2019-07-30 15:00:20
【问题描述】:

以下是家庭作业问题:对于每个学生的姓名,列出课程编号、学生参加的课程、学生在哪里获得的最低成绩。

我不断收到太多值错误

我写的SQL:

SELECT DISTINCT student.student_id, std_name
FROM student 
WHERE (student.student_id) IN 
(SELECT enrollment.student_id, course#, MIN(grade) 
FROM enrollment
GROUP BY enrollment.student_id);

我无法对多列执行任何子查询

SELECT DISTINCT student.student_id, std_name
FROM student 
WHERE (student.student_id) IN 
(SELECT enrollment.student_id, course#, MIN(grade) 
FROM enrollment
GROUP BY enrollment.student_id);

ORA-00913: 值太多 00913. 00000 - “值太多” *原因:
*操作:行错误:18 列:2

【问题讨论】:

  • 问题含糊不清。目前尚不清楚“最低”成绩是学生还是班级的最低成绩。

标签: sql oracle


【解决方案1】:

你的 IN 查询应该匹配你 WHERE 语句中的列。

SELECT A.student_id, A.std_name, B.course#, B.min_grade
FROM student A
    INNER JOIN
        ( SELECT student_id, course#, MIN(grade) AS min_grade
          FROM enrollment
          GROUP BY student_id, course#
        ) B
        ON A.student_id = B.student_id
ORDER BY student_id

【讨论】:

  • 我仍然需要在子查询中获取 (course#) 和 MIN (grade)。
  • 您需要使用 INNER JOIN 加入它。让我修改我的答案。
  • 获取非 GROUP BY 表达式。错误。如果有帮助,这里是表格信息:
  • student_id VARCHAR2(25) NOT NULL, std_name VARCHAR2(25) NOT NULL, home_phone CHAR(12) NOT NULL, total_credits NUMBER NOT NULL, gpa NUMBER(10,2) NOT NULL, advisor_id VARCHAR2( 25) NOT NULL, CONSTRAINT student_pk 主键 (student_id), 外键 (advisor_id) REFERENCES FACULTY(faculty_id)
  • course# CHAR(12) NOT NULL, student_id VARCHAR2(25) NOT NULL, Grade NUMBER(10,2) NOT NULL, CONSTRAINT registration_pk PRIMARY KEY (course#,Student_id), FOREIGN KEY (course #) 参考课程(课程#)
【解决方案2】:

据我了解,enrollment 表包含每个学生在每门课程中的成绩列表,并且您想要每门课程中成绩最低的学生的结果集。我想这就是你想要的:

    SELECT s.student_id, s.std_name, e.course#,min_grade
       FROM students s  LEFT JOIN enrollment e ON s.student_id = e.student_id
       LEFT JOIN 
        (SELECT course#, MIN(grade) as min_grade from enrollment GROUP BY course#) mg
        ON e.course# = mg.course#
        WHERE e.grade = mg.min_grade

希望我没有在表名中打错字。

顺便说一句:我不知道分配时是否使用course# 作为列名,但我不建议在表/列名中使用哈希字符。用于表示 SQL Server 中的临时表。

【讨论】:

  • 顺便说一下,如果一个以上的学生在一门课程中的成绩相同,那么您将在结果集中看到所有具有该成绩的学生。
【解决方案3】:

您不能在“in 子句”中放置多列子查询!!! 以下显示了所有至少修过一门课程的学生及其最低分数。

Select student_id, std_name, course#,  min (grade) as min_grade
From student inner join enrollment using (student_id)
group by student_id, std_name,course

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多