SQLite基于指定分类值范围更新行且排除基准行的正确写法
原语句错误原因
- 子查询
SELECT value FROM table WHERE category = '2'会返回多条基准值,直接作为单值运算时SQLite默认只会取第一条结果计算,无法匹配其他基准对应的区间 BETWEEN语法要求左侧值小于右侧值,你写的(基准值+4) AND (基准值-4)顺序颠倒,永远不会返回匹配结果EXCEPT使用位置错误,不能直接嵌套在BETWEEN的区间条件中
正确UPDATE实现语句
将语句中的your_table替换为你实际的表名即可:
UPDATE your_table SET category = '3' WHERE category = '1' AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.category = '2' AND your_table.value BETWEEN t2.value - 4 AND t2.value + 4 );
如果你的表名确实是保留字table,需要用反引号转义:
UPDATE `table` SET category = '3' WHERE category = '1' AND EXISTS ( SELECT 1 FROM `table` t2 WHERE t2.category = '2' AND `table`.value BETWEEN t2.value - 4 AND t2.value + 4 );
逻辑说明
- 外层条件
category = '1'自动排除了本身属于基准行的category=2的记录,符合你要求的「更新不属于第一部分基准行」的规则 - 内层
EXISTS子查询会判断当前行的value是否落在任意一个基准值的±4区间内,完美匹配多基准区间的匹配需求 - 用你提供的示例数据测试,该语句会正好匹配rowid为6、7、8、11的四行,更新结果和你的预期完全一致
内容的提问来源于stack exchange,提问作者MappingThePast
相关产品推荐
相关产品推荐

