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 ?
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
);