问题描述
使用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
);