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;但是它没有更新表,但是它没有更新表