问题陈述:
如果教师教授的课程数量少于1,则将薪水更新为30000,否则为35000 - 使用一个命令。 我写的代码导致错误,你能告诉我它为什么不工作以及如何改进它。提前致谢:D
UPDATE 使用oracle sql
架构:
讲师 - > id,name,dept_name,salary
教导 - > id,course_id,semester,year
update i
set i.salary = case
when count(t.course_id) < 1 then 30000
else 35000
from (select * from instructor i inner join teaches t on i.id = t.id)
答案 0 :(得分:1)
这是一个例子;我创建了自己的桌子(因为你没有提供你的桌子),我希望它有意义。
SQL> create table instructor (id_instructor number, salary number);
Table created.
SQL> insert into instructor values (1, 100);
1 row created.
SQL> insert into instructor values (2, 100);
1 row created.
SQL>
SQL> create table teaches (id_instructor number, id_course number);
Table created.
SQL> insert into teaches values (1, 1);
1 row created.
SQL> insert into teaches values (1, 2);
1 row created.
SQL>
由于老师ID = 2教“没有”,他的薪水应该是30000.另一方面,老师ID = 2教2个班,所以他会得到35000。
SQL> update instructor i set
2 i.salary = (select case when count(*) < 1 then 30000
3 else 35000
4 end
5 from teaches t
6 where t.id_instructor = i.id_instructor);
2 rows updated.
SQL> select * from instructor;
ID_INSTRUCTOR SALARY
------------- ----------
1 35000
2 30000
SQL>
答案 1 :(得分:1)
我不建议在子查询中使用count(*)
。 count(*) < 1
实际上是说没有行存在。当exists
合适时,您正在使用聚合 - 这是性能损失。
所以更好的方法是:
update instructor i
set salary = (select case when exists (select 1 from teaches t where t.id_instructor = i.id_instructor)
then 30000 else 35000
end);
如果您正在学习SQL,那么您应该学习最好的方法。
答案 2 :(得分:0)
update i
set i.salary = (case when t.id IS NULL then 30000 else 35000 END)
from instructor i
LEFT OUTER join teaches t on i.id = t.id