簡體   English   中英

根據另一個表的聚合結果更新表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM