2009-10-10 72 views
0

表:如何參考更新當前正在更新的行?

  • 學生(名稱,點)
  • playsin(名稱 - >學生(名稱),得分)

我試圖使用方法:

UPDATE STUDENT 
    SET points = points + CONSTANT * (SELECT score 
             FROM PLAYSIN 
             WHERE playsin.name = student.name); 
+0

可否請你重新寫一點點,使其更容易理解? – 2009-10-10 22:56:56

+0

@Filip:在添加到現有學生的積分值之前,該算法讀取的數據是學生的得分乘以常數。 – 2009-10-10 23:02:33

+0

這假設「名稱」可以用作主鍵,對嗎? – Thorsten 2009-10-10 23:07:25

回答

2

Try:

UPDATE STUDENT s 
    SET points = s.points + CONSTANT * (SELECT p.score 
             FROM PLAYSIN p 
             WHERE p.name = s.name) 

表別名是一個非常好的習慣。

+0

現在不能試用它,但真的需要別名嗎?似乎即使沒有別名,參考文獻也很清楚。 – Thorsten 2009-10-10 23:11:38

+0

@IronGoofy:我無法測試:/但是它可能是引用公式中的點值來更新它的事實,或者是我認爲PLAYSIN表的連接。 – 2009-10-10 23:15:30

+0

謝謝,使用別名解決了我的問題。非常感謝你。 – Link 2009-10-11 01:41:02

1

您也可以嘗試更新的在線觀點:

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中。

0

你可以試試這個未來:

UPDATE student s, playsin p 
SET s.points = s.points + CONSTANT * p.score 
WHERE p.name=s.name