- 學生(名稱,點)
- playsin(名稱 - >學生(名稱),得分)
我試圖使用方法:
UPDATE STUDENT
SET points = points + CONSTANT * (SELECT score
FROM PLAYSIN
WHERE playsin.name = student.name);
我試圖使用方法:
UPDATE STUDENT
SET points = points + CONSTANT * (SELECT score
FROM PLAYSIN
WHERE playsin.name = student.name);
Try:
UPDATE STUDENT s
SET points = s.points + CONSTANT * (SELECT p.score
FROM PLAYSIN p
WHERE p.name = s.name)
表別名是一個非常好的習慣。
您也可以嘗試更新的在線觀點:
UPDATE (select s.name student_name,
s.points student_points,
p.score playsin_score
from STUDENT s,
PLAYSIN p
where p.name = s.name)
SET student_points = student_points + CONSTANT * playsin_score;
這也限制了更新,只設定了其中有 在PLAYSIN行(你也可以考慮在學生行在您當前的代碼中,如果子查詢可能返回NULL,SCORE會發生什麼)。您需要playin.name上的唯一或主鍵來使用此語法來避免加入基數檢查錯誤,但如果這不可行,則MERGE語句可能會有用。無論如何,MERGE可能值得考慮,如果您還有代碼將PLAYSIN中的任何新名稱添加到STUDENT中。
你可以試試這個未來:
UPDATE student s, playsin p
SET s.points = s.points + CONSTANT * p.score
WHERE p.name=s.name
可否請你重新寫一點點,使其更容易理解? – 2009-10-10 22:56:56
@Filip:在添加到現有學生的積分值之前,該算法讀取的數據是學生的得分乘以常數。 – 2009-10-10 23:02:33
這假設「名稱」可以用作主鍵,對嗎? – Thorsten 2009-10-10 23:07:25