如何解决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
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。