SQL将列中的所有行设置为其他列的倍数

时间:2019-03-26 16:32:21

标签: sql for-loop variables sql-update mariadb

我需要将表用户所有行中的所有列exp_perkPoints设置为列exp_level的相应值的倍数。

我为表中的所有302行创建了此代码,但是出现以下错误:#1064-'DECLARE旁边的语法有问题    第1行的数字(3)”

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。

编辑: 我也尝试使用以下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

样本数据:

表:用户

列:userid,exp_level,exp_perkPoints

1 | 12 |空

2 | 1 |空

所需结果: 对于等于1的用户ID,使用他的exp_level,将他的exp_perkPoints设置为exp_level * 2。 重复所有用户ID。

1 个答案:

答案 0 :(得分:1)

使用数据库时,必须考虑集合而不是一一处理行,这是循环的方式。基于集合的解决方案在数据库中表现更好,并且代码简洁。

对于这个问题,对users表的exp_perkPoints列执行更新看起来像这样:

update users
set exp_perkPoints = exp_level * 2;

结果是:
enter image description here