Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-使用基于两个表的表达式更新表列值_Sql_Sqlite_Sql Update_Subquery - Fatal编程技术网

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

使用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  
              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  
);