Sql 基于其他两个表更新列

Sql 基于其他两个表更新列,sql,sql-update,monetdb,Sql,Sql Update,Monetdb,我有以下三个表格: select * from student_grade; +--------------+----------+----------+-------+--------------------------+ | enrollmentid | courseid | personid | grade | credits_earned | +==============+==========+==========+=======+=================

我有以下三个表格:

select * from student_grade;
+--------------+----------+----------+-------+--------------------------+
| enrollmentid | courseid | personid | grade | credits_earned           |
+==============+==========+==========+=======+==========================+
|            1 |     1001 |        1 | A     |                     null |
|            2 |     1002 |        1 | B     |                     null |
|            3 |     1003 |        1 | A     |                     null |
|            4 |     3001 |        3 | A     |                     null |
|            5 |     3001 |        2 | B     |                     null |
|            6 |     4001 |        4 | A     |                     null |
|            7 |     4002 |        4 | A     |                     null |
+--------------+----------+----------+-------+--------------------------+
7 tuples
sql>select * from course;
+----------+-------------------+---------+--------------+
| courseid | title             | credits | departmentid |
+==========+===================+=========+==============+
|     1001 | Data structures   |      12 |          101 |
|     1002 | Algorithms        |      12 |          101 |
|     1003 | Graphics          |      20 |          101 |
|     2001 | DSP               |      20 |          102 |
|     2002 | Matlab            |      20 |          102 |
|     2003 | Maths             |      10 |          102 |
|     3001 | CAD               |      10 |          104 |
|     4001 | Power electronics |      10 |          103 |
|     4002 | Semi conductors   |      20 |          103 |
+----------+-------------------+---------+--------------+
9 tuples
sql>select * from grade_to_credits;
+-----------+--------------------------+
| gradechar | credits                  |
+===========+==========================+
| A         |                        1 |
| B         |                      0.9 |
+-----------+--------------------------+
我想做的是: 我正在使用
课程
表的
学分
列和
等级
表的
学分
列更新
学生等级
表的
学分

就这样,

select c.credits * gc.credits 
from course c, grade_to_credits gc, student_grade sg 
where sg.courseid = c.courseid and sg.grade = gc.gradechar;
+--------------------------+
| L2                       |
+==========================+
|                       12 |
|                     10.8 |
|                       20 |
|                       10 |
|                        9 |
|                       10 |
|                       20 |
+--------------------------+
我在单独执行时得到上述值,但现在我想使用update查询更新
student_grade
表中的这些值

现在,我将查询用作:

update student_grade 
set credits_earned = (select c.credits * gc.credits 
                      from course c, grade_to_credits gc, student_grade sg 
                      where sg.courseid = c.courseid 
                        and sg.grade = gc.gradechar);
但是上面的查询不起作用,我得到的错误如下:

基数冲突,应为标量值

我知道,我可以单独设置这些值,但我想通过update命令进行设置。
请纠正我的错误。

注意:下面的解决方案在MySQL中工作。(OP后来将问题从MySQL重新标记/更改为MonetDB)

  • 您尝试的问题是内部子查询返回了多行
  • 即使它只返回一行,它的另一个问题是使用相同的值(内部子查询的输出)更新表
    student\u grade
    中的所有
    credits\u owned
    字段
  • 应该避免使用隐式联接。它们很老,不是一种好的做法
您应该选择这些表,然后使用 已联接表的列以更新行数据。请尝试以下操作:

update student_grade sg 
inner join course  c on c.courseid = sg.courseid 
inner join grade_to_credits gc on gc.gradechar = sg.grade 
set sg.credits_earned = c.credits * gc.credits;

注意:下面的解决方案在MySQL中工作。(OP后来将问题从MySQL重新标记/更改为MonetDB)

  • 您的尝试的问题是内部子查询返回的行不止一行
  • 即使它只返回一行,它的另一个问题是使用相同的值(内部子查询的输出)更新表
    student\u grade
    中的所有
    credits\u owned
    字段
  • 应该避免使用隐式联接。它们很老,不是一种好的做法
您应该选择这些表,然后使用 已联接表的列以更新行数据。请尝试以下操作:

update student_grade sg 
inner join course  c on c.courseid = sg.courseid 
inner join grade_to_credits gc on gc.gradechar = sg.grade 
set sg.credits_earned = c.credits * gc.credits;

如果我理解正确,您只需从子查询中删除
student\u grade

update student_grade st
    set credits_earned = (select sc.credits * gc.credits
                          from course c cross join
                               grade_to_credits gc
                          where sg.courseid = c.courseid and
                                sg.grade = gc.gradechar
                         );

如果我理解正确,您只需从子查询中删除
student\u grade

update student_grade st
    set credits_earned = (select sc.credits * gc.credits
                          from course c cross join
                               grade_to_credits gc
                          where sg.courseid = c.courseid and
                                sg.grade = gc.gradechar
                         );

无需过度复杂,使用
左连接
即可获得结果。集合操作通常比逐行操作更有效

update student_grade 
SET  credits_earned = a.credits_earned
from (
select  s.enrollmentid,
        s.courseid,
        s.personid,
        s.grade,
        (g.credits * c.credits) as credits_earned
from student_grade s
LEFT OUTER JOIN @grade_to_credits g ON g.gradechar = s.grade
LEFT OUTER JOIN @course c           ON c.courseid  = s.courseid 
) as a
where student_grade.enrollmentid = a.enrollmentid
结果:

1   1001    1   A   12
2   1002    1   B   10,8
3   1003    1   A   20
4   3001    3   A   10
5   3001    2   B   9
6   4001    4   A   10
7   4002    4   A   20

无需过度复杂,使用
左连接
即可获得结果。集合操作通常比逐行操作更有效

update student_grade 
SET  credits_earned = a.credits_earned
from (
select  s.enrollmentid,
        s.courseid,
        s.personid,
        s.grade,
        (g.credits * c.credits) as credits_earned
from student_grade s
LEFT OUTER JOIN @grade_to_credits g ON g.gradechar = s.grade
LEFT OUTER JOIN @course c           ON c.courseid  = s.courseid 
) as a
where student_grade.enrollmentid = a.enrollmentid
结果:

1   1001    1   A   12
2   1002    1   B   10,8
3   1003    1   A   20
4   3001    3   A   10
5   3001    2   B   9
6   4001    4   A   10
7   4002    4   A   20

您要获得积分的子查询必须只返回一行。我相信它返回了多行。是的,它返回了多行,我们不能在设置值时对每行进行迭代吗?检查我的答案。如果它对您有效,请向上投票并接受它:)您获得积分的子查询必须只返回一行。我相信它返回了多行。是的,它返回了多行,我们不能在设置值时对每行进行迭代吗?检查我的答案。如果它对您有效,请向上投票并接受它:)获取错误为:语法错误,意外标识,期望设置为:“update student_grade sg”@Anil typo在那里。我已经修好了,请再检查一下。希望你也能纠正你的反对票。那纯粹是打字错误!仍然得到相同的错误,你能告诉我打字错误吗?@Anil在第二个内部连接中有两次
。我刚刚删除了
上的更新学生_gradesg internal join course c on c.courseid=sg.courseid internal join grade_to_credits gc on gc.grade char=sg.grade set sg.credits_owned=c.credits*gc.credits;获取错误为:语法错误,意外标识,期望设置为:“update student_grade sg”@Anil typo在那里。我已经修好了,请再检查一下。希望你也能纠正你的反对票。那纯粹是打字错误!仍然得到相同的错误,你能告诉我打字错误吗?@Anil在第二个内部连接中有两次
。我刚刚删除了
上的更新学生_gradesg internal join course c on c.courseid=sg.courseid internal join grade_to_credits gc on gc.grade char=sg.grade set sg.credits_owned=c.credits*gc.credits;但是它没有更新表,但是它没有更新表