2014-12-07 2 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 является "внешний ключ" для рк персонажа. То, что я пытаюсь сделать, - это символы и эффекты запроса и применить модификатор эффектов HP к персонажам. Поэтому я в основном обновляю персонаж hp, присоединяясь ко всем эффектам, связанным с этим персонажем и модификатором персонажа hp с эффектом HP.

Так, например, с приведенными выше данными, «Дувак» должен потерять 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 

Теперь я получаю ошибки на «ВНУТРЕННИЙ» и «JOIN». Я получаю ошибки на "." для имени tablename.fieldname. Я попробовал установить SET перед JOIN, и он не работает. Я думаю, что это может быть ограничение SQLite, что он не может поддерживать соединение в запросе обновления.

Любые другие предложения?

ответ

3

SQLite не поддерживает JOIN в UPDATE заявления.

Вместо этого замените 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

+0

Нет, он не сработает с сообщением о том, что требуется скалярное значение, но было возвращено несколько значений (или что-то в этом роде). Вы должны убедиться, что внутренний оператор SELECT возвращает только одну строку, либо выбрав индекс UNIQUE, либо PRIMARY KEY, либо путем агрегирования результатов (например, «MAX (HP)») или путем ограничения результатов (например, «LIMIT» 1'). –

Смежные вопросы