Sql case语句中的count函数

Sql case语句中的count函数,sql,Sql,问题陈述: 如果讲师教授的课程数量少于1门,则将工资更新为30000,否则更新为35000- 使用一个命令。 我写的代码导致了一个错误,你能告诉我为什么它不工作以及我如何改进它吗。提前感谢:D 更新 使用oraclesql 模式: 讲师->id、姓名、部门名称、工资 教师->id,课程id,学期,年份 这里有一个例子;我创建了我自己的表,因为您没有提供您的表,我希望这会有意义 SQL> create table instructor (id_instructor number, salar

问题陈述:

如果讲师教授的课程数量少于1门,则将工资更新为30000,否则更新为35000- 使用一个命令。 我写的代码导致了一个错误,你能告诉我为什么它不工作以及我如何改进它吗。提前感谢:D

更新 使用oraclesql

模式:


讲师->id、姓名、部门名称、工资

教师->id,课程id,学期,年份


这里有一个例子;我创建了我自己的表,因为您没有提供您的表,我希望这会有意义

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>
我不建议在子查询中使用count*。count*<1实际上是指不存在行。在适当的情况下使用聚合,这会影响性能

因此,更好的方法是:

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,你应该学习做事情的最佳方法。

讲师和教师的模式是什么?另外,您正在使用哪个sql数据库?是mysql吗?你需要在子查询中进行聚合。讲师->id,姓名,部门名称,工资教师->id,课程id,学期,年份我正在使用oracle SQL。而这个代码片段可以解决这个问题,确实有助于提高你的帖子质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
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
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);