SQL-使用基于两个表的表达式更新表列值

问题描述

使用sqlite数据库我有一个users表和一个带有以下列的ranks表:

用户表: id |等级| xp

排名表 id |名称| xpLowerLevel

我的目标是根据ranks表中的xpLowerLevel字段更新所有用户行的rankId字段。我的sql表达式如下:

UPDATE users 
SET rankId = (SELECT id FROM ranks 
              WHERE xpLowerLevel <= users.xp  
              ORDER BY ABS(xpLowerLevel - users.xp) 
              LIMIT 1);

这给了我以下错误没有这样的列:users.xp 。我在做什么错了?

解决方法

问题出在order by子句中,SQLite显然不接受对正在更新的表的引用。但是我不确定您仍然需要该参考。您的列名为xpLowerLevel,这使我认为您确实需要:

update users
set rankid = (
    select id 
    from ranks
    where xpLowerLevel <= users.xp  
    order by xpLowerLevel desc
    limit 1
);
,

具有FIRST_VALUE()窗口功能:

UPDATE users 
SET rankId = (
  SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY ABS(xpLowerLevel - users.xp))
  FROM ranks 
  WHERE xpLowerLevel <= users.xp  
);

或者因为已经存在条件:

WHERE xpLowerLevel <= users.xp

区别:

users.xp - xpLowerLevel

>= 0
因此不需要功能ABS()

UPDATE users 
SET rankId = (
  SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY users.xp - xpLowerLevel)
  FROM ranks 
  WHERE xpLowerLevel <= users.xp  
);