SQL-使用基于两个表的表达式更新表列值
使用Sqlite数据库,我有一个users表和一个ranks表,其中包含以下列: 用户表: id | rankid | xp 等级表 id | name | xpLowerLevel 我的目标是基于ranks表中的xpLowerLevel字段更新所有用户行的rankId字段。我的Sql表达式如下所示:SQL-使用基于两个表的表达式更新表列值,sql,sqlite,sql-update,subquery,Sql,Sqlite,Sql Update,Subquery,使用Sqlite数据库,我有一个users表和一个ranks表,其中包含以下列: 用户表: id | rankid | xp 等级表 id | name | xpLowerLevel 我的目标是基于ranks表中的xpLowerLevel字段更新所有用户行的rankId字段。我的Sql表达式如下所示: UPDATE users SET rankId = (SELECT id FROM ranks WHERE xpLowerLevel <= users.xp
UPDATE users
SET rankId = (SELECT id FROM ranks
WHERE xpLowerLevel <= users.xp
ORDER BY ABS(xpLowerLevel - users.xp)
LIMIT 1);
这给了我以下错误:users.xp。我做错了什么?问题在于ORDERBY子句,其中SQLite显然不接受对正在更新的表的引用。但我不确定你是否需要这份证明。您的专栏名为xpLowerLevel,这让我觉得您实际上想要:
update users
set rankid = (
select id
from ranks
where xpLowerLevel <= users.xp
order by xpLowerLevel desc
limit 1
);
问题是ORDERBY子句,其中SQLite显然不接受对正在更新的表的引用。但我不确定你是否需要这份证明。您的专栏名为xpLowerLevel,这让我觉得您实际上想要:
update users
set rankid = (
select id
from ranks
where xpLowerLevel <= users.xp
order by xpLowerLevel desc
limit 1
);
使用第一个_值窗口功能:
UPDATE users
SET rankId = (
SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY ABS(xpLowerLevel - users.xp))
FROM ranks
WHERE xpLowerLevel <= users.xp
);
大于等于0,
因此,不需要ABS功能:
使用第一个_值窗口功能:
UPDATE users
SET rankId = (
SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY ABS(xpLowerLevel - users.xp))
FROM ranks
WHERE xpLowerLevel <= users.xp
);
大于等于0,
因此,不需要ABS功能:
实际上,我正试图获得用户当前xp下最接近的rank.xpLowerLevel,因此这两个字段的绝对差是必须的。实际上,我正试图获得用户当前xp下最接近的rank.xpLowerLevel,因此这两个字段的绝对差是必须的。这非常有效!非常感谢。如果你手头有时间,我很想理解为什么这样做而不是我的声明。这一定是SQLite的一个特性,它不允许在相关子查询的ORDER BY子句中使用外部查询的列。我在Postgresql中尝试了相同的代码,它在语法上是正确的:谢谢您的时间!这应该是答案,因为它解决了我使用外部表在子查询中执行复杂表达式的需要。这非常有效!非常感谢。如果你手头有时间,我很想理解为什么这样做而不是我的声明。这一定是SQLite的一个特性,它不允许在相关子查询的ORDER BY子句中使用外部查询的列。我在Postgresql中尝试了相同的代码,它在语法上是正确的:谢谢您的时间!这应该是答案,因为它满足了我使用外部表在子查询中执行复杂表达式的需要。
UPDATE users
SET rankId = (
SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY users.xp - xpLowerLevel)
FROM ranks
WHERE xpLowerLevel <= users.xp
);