2014-12-07 71 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