从另一个相关表中输入一个表中的列值

时间:2014-11-23 20:45:07

标签: sql

我有两个表,StudentsCourse_Registrations,每个学生都会注册几个课程。

在我的students表格中,我有他/她的学位(MS / BS),但在course_Registrations表中缺少。我已尝试使用以下代码获取course_registrations中的每个学生学位课程,但我收到此错误:

标量子查询只允许返回单行

有什么建议吗?

Update  ROOT.ISB_COURSE_REGISTRATIONS
set ROOT.ISB_COURSE_REGISTRATIONS.degree=
(
    Select ROOT.ISB_STUDENTS.degree
    from ROOT.ISB_STUDENTS
    where ROOT.ISB_STUDENTS.STUDENT_ID=ROOT.ISB_COURSE_REGISTRATIONS.STUDENT_ID
)

where exists 
(
    select *
    from ROOT.ISB_STUDENTS
    where ROOT.ISB_STUDENTS.STUDENT_ID=ROOT.ISB_COURSE_REGISTRATIONS.STUDENT_ID
    GROUP BY STUDENT_ID      
 );

3 个答案:

答案 0 :(得分:2)

您遇到问题,因为有些学生在ISB_STUDENTS中有多行。您需要弄清楚如何将它们组合起来。与此同时,我建议:

Update  ROOT.ISB_COURSE_REGISTRATIONS
    set degree = (Select MAX(s.degree)
                  from ROOT.ISB_STUDENTS s
                  where ISB_STUDENTS.STUDENT_ID = s.STUDENT_ID
                 )
    where exists (select 1
                  from ROOT.ISB_STUDENTS s
                  where s.STUDENT_ID = ISB_COURSE_REGISTRATIONS.STUDENT_ID
                  group by s.STUDENT_ID
                  having min(s.degree) = max(s.degree)
                 );

请注意having子句中子查询中where子句的使用。仅当学生记录中的所有学位相同时,才会设置该值。然后你可以调查两个问题:

  • 在名为ISB_STUDENTS的表格中,为什么会出现重复STUDENT_ID s?
  • 当有这样的重复时,你将如何处理多个不一致的度数?

答案 1 :(得分:0)

你可以试试这个:

Update  ROOT.ISB_COURSE_REGISTRATIONS
set ROOT.ISB_COURSE_REGISTRATIONS.degree=
(
    Select MAX(ROOT.ISB_STUDENTS.degree)
    from ROOT.ISB_STUDENTS
    where ROOT.ISB_STUDENTS.STUDENT_ID=ROOT.ISB_COURSE_REGISTRATIONS.STUDENT_ID
)

where exists 
(
    select 1
    from ROOT.ISB_STUDENTS
    where ROOT.ISB_STUDENTS.STUDENT_ID=ROOT.ISB_COURSE_REGISTRATIONS.STUDENT_ID
 );

ISB_COURSE_REGISTRATIONS

中的每一行计算此相关子查询
Select ROOT.ISB_STUDENTS.degree
from ROOT.ISB_STUDENTS
where ROOT.ISB_STUDENTS.STUDENT_ID=ROOT.ISB_COURSE_REGISTRATIONS.STUDENT_ID

因此,如果它为某个ISB_COURSE_REGISTRATIONS.degree返回多行,则不清楚将哪一行设置为值。

MAX(ROOT.ISB_STUDENTS.degree)应用于此子查询的所有行可确保只有一行。

但是你应该小心这个更新。也许有一个学生参加不同的课程,每个课程都有不同程度的mybe。

答案 2 :(得分:0)

我从你的问题中了解到,你有以下

  1. 包含学位字段的学生表
  2. course_registration表,其中还包含学位字段,并且您希望从学生表中为每个学生更新
  3. 如果是这样,你可以尝试这个

    Update r set r.degree=s.degree
    from ROOT.ISB_COURSE_REGISTRATIONS r
    inner join ROOT.ISB_STUDENTS s on r.STUDENT_ID=s.STUDENT_ID
    

    如果我误解了您的任何要求,请澄清

    希望这会对你有所帮助