正在根据另一个 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 示例。
这样做的想法是,我正在尝试根据指导新生、大二学生、大三学生或大四学生的情况,以不同方式更新他们的薪水。只应应用最高适用加薪,我收集到的是 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 示例。