正在根据另一个 table 的聚合结果更新 table

Updating a table based on aggregation results from another table

这样做的想法是,我正在尝试根据指导新生、大二学生、大三学生或大四学生的情况,以不同方式更新他们的薪水。只应应用最高适用加薪,我收集到的是 case 语句按顺序评估的事实。

我正在使用 select 语句来计算是否有教师指导特定类别学生的情况,然后如果有,应用适用的加薪。

update Instructor i
set i.Salary = (
case 
when (0 < (select count(*) from Student s where s.Classification = "Senior" 
    and i.InstructorID = s.MentorID)) then i.Salary * 1.1
when (0 < (select count(*) from Student s where s.Classification = "Junior" 
    and i.InstructorID = s.MentorID)) then i.Salary * 1.08
when (0 < (select count(*) from Student s where s.Classification = "Sohpomore" 
    and i.InstructorID = s.MentorID)) then i.Salary * 1.06
when (0 < (select count(*) from Student s where s.Classification = "Freshman" 
    and i.InstructorID = s.MentorID)) then i.Salary * 1.04
else i.Salary
end);

我写的这个查询没有执行。将 select 语句放在 when 中作为比较是否有效?如果是这样,上面的代码有什么问题?或者我是否必须将它们移动到具有某些控制流逻辑的 where 语句中?由于 select 语句数量众多,我感觉效率很低。

编辑:这是一些示例数据和预期输出:

Student: MentorID Classification
         100      Sophomore
         101      Junior
         102      Senior
         101      Senior

Instructor: InstructorID Salary
            100          100000 
            101          50000 
            102          80000 
            103          100000 

更新后

Instructor: InstructorID Salary
            100          106000 //*1.06 because mentee is a sophomore
            101          55000  //*1.1 because highest mentee is senior
            102          88000  //*1.1 because mentee is a senior
            103          100000 //No change because no mentees

你是对的,运行 多个 select 语句可能效率低下。你可以消除它。在进行任何更新之前,我认为我们可以同意我们至少需要以下内容:

  • 每位讲师指导每个类别的多少学生?

让我们考虑以下针对教师和学生的样本数据集:

| instructorID | name | salary |
+--------------+------+--------+
|       1      | Adam |    1   |
|       2      | Sam  |    1   |
|       3      | John |    1   |
|       4      | Jane |    1   |

| studentID | classification | mentorID |
+-----------+----------------+----------+
|    1      |   Senior       |    1     |
|    2      |   Junior       |    1     |
|    3      |   Sophomore    |    2     |
|    4      |   Freshman     |    2     |
|    5      |   Senior       |    1     |
|    6      |   Freshman     |    3     |
|    7      |   Sophomore    |    1     |

在这种情况下,Adam 教高年级,所以他的薪水应该达到 1.1。约翰最多教二年级,所以他的薪水将为 1.06。 Sam最多教一个新生,所以他的薪水是1.04,而Jane没有教任何人所以最后她的薪水应该还是1。

我们可以使用以下聚合找到每位教师的学生人数:

SELECT i.instructorID,
   SUM(s.classification = 'Senior') AS numSeniors,
   SUM(s.classification = 'Junior') AS numJuniors,
   SUM(s.classification = 'Sophomore') AS numSophomores,
   SUM(s.classification = 'Freshman') AS numFreshmen
FROM instructor i
LEFT JOIN student s ON s.mentorID = i.instructorID
GROUP BY i.instructorID;

您可以将其用作更新语句中的 JOIN 以使用 case 语句设置值:

UPDATE instructor i
JOIN (mySubquery) tmp ON tmp.instructorID = i.instructorID
SET i.salary = 
   CASE WHEN tmp.numSeniors > 0 THEN (i.salary * 1.1)
   WHEN tmp.numJuniors > 0 THEN (i.salary * 1.08)
   WHEN tmp.numSophomores > 0 THEN (i.salary * 1.06)
   WHEN tmp.numFreshmen > 0 THEN (i.salary * 1.04)
   ELSE i.salary END;

这是一个 SQL Fiddle 示例。