SQL устанавливает все строки в столбце как кратные для другого столбца - PullRequest
0 голосов
/ 26 марта 2019

Мне нужно установить все столбцы exp_perkPoints во всех строках пользователей таблицы, кратные соответствующему значению столбца exp_level.

Я создал этот код для всех 302 строк в моей таблице, однако я получаю эту ошибку: # 1064 - Что-то не так в вашем синтаксисе рядом с 'DECLARE число (3) 'в строке 1

DECLARE 
   a number(3); 
   @b number(3);
BEGIN 
   FOR a in 1 .. 302 LOOP 
    SELECT @b = `exp_level`
        FROM `users`
        WHERE `userid` = a; 
    UPDATE `users` SET `exp_perkPoints`=@b*2;
  END LOOP; 
END; 
/

Мой ожидаемый результат - для каждого пользователя exp_perkPoints должно быть установлено значение 2 * exp_level.

Edit: Я также попробовал следующий синтаксис mariadb, но безуспешно:

BEGIN
  DECLARE v1 INT DEFAULT 302;
  DECLARE v2 INT DEFAULT 0;

  WHILE v1 > 0 DO
    SELECT exp_level INTO v2
    FROM users
    WHERE userid = v1;
    UPDATE users
    SET exp_perkPoints = v2 * 2
    WHERE userid = v1;
    SET v1 = v1 - 1;
  END WHILE;
END

Пример данных:

Таблица: пользователи

Столбцы: ИД пользователя, exp_level, exp_perkPoints

1 | 12 | пусто

2 | 1 | пусто

и т.д.

Желаемый результат: Для идентификатора пользователя, равного 1, возьмите его exp_level, установите его exp_perkPoints как exp_level * 2. Повторите для всех идентификаторов пользователей.

1 Ответ

1 голос
/ 27 марта 2019

При работе с базами данных крайне важно думать в наборах, а не обрабатывать строки один за другим, как работает цикл.Решения на основе наборов работают лучше в базах данных, а код лаконичен.

Для этого вопроса выполнение обновления столбца exp_perkPoints в таблице пользователей выглядит следующим образом:

update users
set exp_perkPoints = exp_level * 2;

Вотрезультат:
enter image description here

...