2014-12-07 70 views
0

好吧,我在這個論壇上嘗試了幾乎所有的解決方案,但無法使其工作。我總是得到語法錯誤。而不是加載數據和手動做骯髒的工作,我試圖通過只運行SQL更新查詢來查看是否可以做到這一點。SQLite:內部加入的複雜更新報告

我有2個表,一個包含字符,另一個包含主動效果。我只會顯示重要的字段。

字符

pk name  hp location 
1 duvack  16 2 
2 arielle  51 2 
3 Larienna 47 2 

效果

pk name  HP target_id target_type 
4 Paralyze  1   1 
5 Seal   1   1 
8 Blind   1   1 
12 Insanity  1   1 
14 Poison -1 1   1 

Target_id是一個 「外鍵」,以人物的PK。我試圖做的是查詢字符和效果,並將效果的HP修飾符應用於角色。所以我基本上是通過加入綁定到該角色的所有效果來修改角色hp,並修改hp角色的效果HP。

例如,對於上面的數據,「Duvack」應該因爲中毒而損失1馬力。

所以應該給這樣的查詢:

UPDATE character 
INNER JOIN effect ON character.pk=effect.target_id 
SET character.hp = character.hp + effect.HP 
WHERE effect.target_type=1 AND character.location = 2 

現在,我得到的「內部」和「加盟」的錯誤。我遇到「。」錯誤。爲tablename.fieldname。我試着在JOIN之前放置SET,它不起作用。我認爲這可能是SQLite的限制,它不能支持更新查詢中的連接。

其他建議?

回答

3

SQLite不支持JOINUPDATE語句。

相反,更換JOIN有相關SELECT聲明:

UPDATE character 
    SET hp = 
    (hp + (SELECT HP FROM effect WHERE effect.target_id = character.pk AND effect.target_type = 1)) 
    WHERE character.location = 2 
+0

在這種情況下,如果不存在滿足WHERE條件多效應,都將在同一人物多次更新? – larienna 2014-12-08 14:21:30

+0

不,它會失敗,並顯示一個消息,指出需要一個標量值,但返回多個值(或其他值)。您必須確保內部'SELECT'語句只返回一行,或者通過選擇UNIQUE索引或PRIMARY KEY,或者通過彙總結果(例如'MAX(HP)')或限制結果(例如'LIMIT 1')。 – 2014-12-08 14:24:07