[英]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 |
在這種情況下,亞當教大四的,所以他的薪水應該達到1.1。 約翰最多教二年級,所以他的薪水將是1.06。 山姆最多只能教一名大一新生,因此他的薪水將為1.04,而簡不教任何人,因此她的薪水應在最后保持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;
您可以在update語句中將其用作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示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.