Using a Sqlite database, I have a users table and a ranks table with the following columns:
users table: id | rankid | xp
ranks table id | name | xpLowerLevel
My goal is update the rankId field for all user rows based on the xpLowerLevel field from the ranks table. My Sql expression as follows:
UPDATE users SET rankId = (SELECT id FROM ranks WHERE xpLowerLevel <= users.xp ORDER BY ABS(xpLowerLevel - users.xp) LIMIT 1);
Which gives me the following error no such column: users.xp. What am I doing wrong ?
Advertisement
Answer
With FIRST_VALUE()
window function:
UPDATE users SET rankId = ( SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY ABS(xpLowerLevel - users.xp)) FROM ranks WHERE xpLowerLevel <= users.xp );
Or since there is already the condition:
WHERE xpLowerLevel <= users.xp
the difference:
users.xp - xpLowerLevel
is >= 0
,
so there is no need for the function ABS()
:
UPDATE users SET rankId = ( SELECT DISTINCT FIRST_VALUE(id) OVER (ORDER BY users.xp - xpLowerLevel) FROM ranks WHERE xpLowerLevel <= users.xp );